2012-11-24 66 views
3

可能重複:
Strings as template arguments?模板參數字符串與INT

爲什麼第一個聲明是確定的,但第二個是不是?爲什麼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>' 

使用鐺++。

回答

8

您根本不能擁有std::string類型的模板參數。用於非類型模板參數的規則是由標準定義如下(§14.1/ 4):

一種非型模板參數應具有下列(任選之一CV-合格 )類型:

  • 整數或枚舉類型,
  • 指針到對象或指針運行,
  • 左值參照到對象或左值參照功能,
  • 指向會員,
  • std::nullptr_t

此外(§14.1/ 7):

非類型模板參數不應被聲明爲具有浮點,類,或空隙的類型。

由於std::string是一個類的類型,您的實例化foo是不允許的。

5

因爲非編譯模板參數(醜的名稱爲「值」)應該可以在編譯時計算,並且std::string不是(它可能需要動態內存分配,因此它的構造函數不是constexpr)。