#include <iostream>
#include <string>
using namespace std;
template <typename T,
typename T::type N,
typename T::strata& X>
struct SomeClass{};
struct S1
{
typedef int type;
typedef string strata;
};
int main () {
SomeClass<S1, 3, string("erg")> x;
}
失败并显示消息:
g++ templ.cc -o templ -std=c++14 templ.cc:18:20: error: non-type template argument does not refer to any declaration SomeClass<S1, 3, string("erg")> x; ^~~~~~~~~~~~~ templ.cc:8:24: note: template parameter is declared here typename T::strata& X>
为什么它适用于int但不适用于字符串? 为什么它说字符串是非类型参数?
答案 0 :(得分:4)
作为值而不是类型或模板的模板参数简称为&#34;非类型模板参数&#34;。
由于引用而失败。如果您有3
,则会在typename T::type& N
上收到类似的错误。
在实例化具有非类型模板参数的模板时,以下限制适用:
- 对于左值引用参数,实例化时提供的参数不能是临时的,未命名的左值,或者没有链接的命名左值(换句话说,参数必须具有链接)。
所以你的临时无效。但你可以这样做:
std::string erg("erg");
int main () {
SomeClass<S1, 3, erg> x;
}