2013-03-02 76 views
0

這是怎麼回事,下面的代碼是錯的?模板接受哪種類型的參數?模板無法接受對象作爲參數

class MyClass 
{ 
    int var; 
}; 

template <MyClass a> struct s 
{ 

}; 

int main() 
{ 
    MyClass var; 
    struct s<var>; 


    return 0; 
} 
+0

模板參數必須是編譯時常量。 – chris 2013-03-02 13:51:33

回答

4

非類型模板參數受到限制,並非所有內容都可以使用。特別是,它們必須是編譯時常量,這不是你的情況。關於模板定義

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中所述。

相關問題