【问题标题】:Array as non-type template argument数组作为非类型模板参数
【发布时间】:2016-06-07 23:02:04
【问题描述】:

我注意到了

template <size_t n, char[n]> class x
{
};

很高兴被我的 C++ 编译器接受。但是,当我天真地尝试类似

x <4, "hey"> something;

我觉得不错

Non type template argument does not refer to any declaration

所以我想知道:我将如何实际使用该模板创建一个类?

【问题讨论】:

  • 我的猜测是您的编译器将“hey”的字符串文字视为 const char* 而不是 char[]
  • 如果你说x&lt;5, "hey"&gt; something;,我认为编译器不会在这里强制执行类型安全。

标签: c++ arrays templates


【解决方案1】:
#include <iostream>

template <size_t n, char s[n]>
class X {
public:
  X() {
    std::cout << s;
    std::cout << std::endl;
  }
};

char hey[] = "hey";

int main() {
  X<4, hey> x;
}

X&lt;4, "hey"&gt; x; 无法编译,因为对于非类型模板参数,存在某些限制:

对于指向对象的指针,模板参数必须指定 具有静态存储持续时间和链接的对象的地址 (内部或外部),或计算的常量表达式 到适当的空指针或 std::nullptr_t 值。

这引发了另一个问题,我在 cppreference.com 上找到了以下内容:

数组和函数类型可以写在模板声明中,但是 它们被指向对象的指针和指向的指针自动替换 适当地发挥作用。

所以s实际上是一个指针,所以下面会编译:

X<5, hey> something;

潜在的缓冲区溢出问题。

【讨论】:

  • 我不明白X&lt;"hey"&gt;char hey[] = "hey"; X&lt;hey&gt; 之间的区别。有没有办法使用更紧凑的符号,类似于"hey" 版本?
  • 简而言之,字符串文字没有链接,甚至没有名字。
  • 当前标准不支持。 stackoverflow.com/questions/2033110/…
【解决方案2】:
template <size_t n, char[n]> class x
{
};

char foobar[]="hey";

x<4, foobar> y;

使用 gcc 5.3.1 编译

【讨论】:

  • 我猜这个论点需要有联系。
猜你喜欢
  • 2019-04-24
  • 2021-03-20
  • 2013-03-30
  • 2017-09-17
  • 2018-06-17
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
相关资源
最近更新 更多