我注意到了
template <size_t n, char[n]> class x
{
};
很高兴被我的C ++编译器接受。但是,当我天真地尝试像
这样的东西时x <4, "hey"> something;
我得到了一个很好的
Non type template argument does not refer to any declaration
所以我想知道:我怎样才能真正用这个模板制作课程?
答案 0 :(得分:2)
#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<4, "hey"> x;
不能编译,因为对于非类型模板参数,某些限制适用:
对于指向对象的指针,模板参数必须指定 具有静态存储持续时间和链接的对象的地址 (内部或外部),或评估的常量表达式 到适当的空指针或std :: nullptr_t值。
这引发了另一个问题,我在cppreference.com上找到了以下内容:
数组和函数类型可以写在模板声明中,但是 它们会被指向对象和指针的指针自动替换 功能酌情。
所以s
实际上是一个指针,因此下面将编译:
X<5, hey> something;
潜在的缓冲区溢出问题。
答案 1 :(得分:0)
template <size_t n, char[n]> class x
{
};
char foobar[]="hey";
x<4, foobar> y;
使用gcc 5.3.1编译