這是怎麼回事,下面的代碼是錯的?模板接受哪種類型的參數?模板無法接受對象作爲參數
class MyClass
{
int var;
};
template <MyClass a> struct s
{
};
int main()
{
MyClass var;
struct s<var>;
return 0;
}
這是怎麼回事,下面的代碼是錯的?模板接受哪種類型的參數?模板無法接受對象作爲參數
class MyClass
{
int var;
};
template <MyClass a> struct s
{
};
int main()
{
MyClass var;
struct s<var>;
return 0;
}
非類型模板參數受到限制,並非所有內容都可以使用。特別是,它們必須是編譯時常量,這不是你的情況。關於模板定義:
template <MyClass a> struct s
// ^^^^^^^
{
};
參見段落的C++ 11標準的14.1/4:
甲非類型模板參數應具有下列(任選CV的一個-qualified)類型:
- 積分或枚舉類型,
- 指向對象或指針噸O功能,
- 左值參考到對象或左值參照功能,
- 指針構件,
- 的std :: nullptr_t。
正如你所看到的,用戶定義的類型是不允許的。關於你的模板的實例,則:
struct s<var>;
// ^^^ You most likely meant something like s<var> obj, but nevermind
見C++ 11標準第14.3.2/1:
的模板參數的一個非類型,非模板模板參數應的之一:
- 用於整型或枚舉類型,模板參數的類型的一個轉換後的常量表達式 (5.19)的非類型模板參數;或
- 非類型模板參數的名稱;或
- 一個常量表達式(5.19),其指定具有靜態存儲持續時間和 外部或內部連接或與外部或內部的鍵的功能,包括函數模板 和功能模板的IDS,但不包括非對象的地址表示(忽略括號)爲 & id-表達式,除了如果名稱引用函數或數組,則可以省略&,並且如果相應的模板參數是引用,則應該省略 ;或
- 一個常量表達式,其值爲空指針值(4.10);或
- 一個常量表達式,其值爲空成員指針值(4.11);或
- 指向成員的指針,如5.3.1中所述。
模板參數必須是編譯時常量。 – chris 2013-03-02 13:51:33