模板参数字符串与int

时间:2012-11-24 17:03:42

标签: c++ templates

  

可能重复:
  Strings as template arguments?

为什么第一个声明没问题,但第二声明没有?为什么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>'

使用clang ++。

2 个答案:

答案 0 :(得分:8)

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

  

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

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

此外(§14.1/ 7):

  

非类型模板参数不得声明为具有浮点,类或void类型。

由于std::string是类类型,因此不允许实例化foo

答案 1 :(得分:5)

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