3

可能重复:
字符串作为模板参数?

为什么第一个声明可以,而第二个声明不行?为什么std::string不适合?

template <typename T, T x> struct foo { };

using namespace std;

int main()
{
    foo<int, 0> f_int;              // ok
    foo<string, ""> f_string;      // not ok
}

我得到:

error: a non-type template parameter cannot have type 'std::basic_string<char>'

使用铿锵++。

4

2 回答 2

8

您根本不能拥有 type 的模板参数std::string。非类型模板参数的规则由标准定义如下(§14.1/4):

非类型模板参数应具有以下类型之一(可选cv-qualified):

  • 整数或枚举类型,
  • 指向对象的指针或指向函数的指针,
  • 对对象的左值引用或对函数的左值引用,
  • 指向成员的指针,
  • std::nullptr_t.

此外(§14.1/7):

不应将非类型模板参数声明为具有浮点、类或 void 类型。

作为std::string类类型,您的实例化foo是不允许的。

于 2012-11-24T17:07:17.530 回答
5

因为非类型模板参数(“值”的丑陋名称)在编译时应该是可计算的,而std::string不是(它可能需要动态内存分配,因此它的构造函数不是constexpr)。

于 2012-11-24T17:07:10.377 回答