第724页,第25章,C ++编程语言
用作模板参数的指针必须是&of
形式,其中是对象或函数的名称,或f
形式的名称,其中f
是函数的名称。指向成员的指针必须是&X::of
形式,其中是成员的名称。特别是,字符串文字不能作为模板参数:
template<typename T, char∗ label>
class X {
// ...
};
X<int,"BMW323Ci"> x1; // **error : string literal as template argument**
char lx2[] = "BMW323Ci";
X<int,lx2> x2; // OK: lx2 has exter nal linkage
第725页,第25章,C ++编程语言
当与默认模板参数(第25.2.5节)结合使用时,这变得特别有用;对于 例如:
template<typename T, T default_value = T{}>
class Vec {
// ...
};
Vec<int,42> c1;
Vec<int> c11; // default_value is int{}, that is, 0
Vec<string,"fortytwo"> c2; // **I'm confused!**
Vec<string> c22; // default_value is string{}; that is, ""
答案 0 :(得分:1)
template<typename T, T default_value = T{}>
class Vec {
// ...
};
Vec<string,"fortytwo"> c2;
Vec<string> c22;
涉及string
的声明都不合法。
14.1 / 4:
非类型模板参数应具有以下之一(可选 cv-qualified )类型:
整数或枚举类型,
指向对象或指向函数的指针,
对对象的左值引用或对函数的左值引用,
指向成员的指针,
std::nullptr_t
。
14.1 / 7:
非类型模板参数不得声明为具有浮点,类或void类型。
答案 1 :(得分:0)
字符串文字不能作为模板参数。使用第一个模板,您必须声明一个char数组以用作模板参数。
使用第二个模板,“fortytwo”不是字符串文字。相反,它是一个std :: string。