2010-05-18 113 views
26

類的構造函數可以是模板函數。在調用這樣的構造函數的地方,編譯器通常會查看賦給構造函數的參數,並從中確定使用的模板參數。是否還有一些語句可以明確指定模板參數?可以明確指定構造函數的模板參數嗎?

一個人爲的例子:

struct A { 
    template<typename T> 
    A() {} 
}; 

有沒有辦法來實例化這個類?顯式指定構造函數的模板參數的語法是什麼?

我的用例是一個問題,因爲編譯器似乎沒有找到正確的模板構造函數。明確指定模板參數可能會生成更多有用的錯誤消息,甚至可以解決問題。

+1

爲構造函數顯式指定模板參數只能在構造函數的顯式特化,實例化,行外定義和朋友聲明中使用。 – 2013-06-07 08:51:26

+0

'模板 結構A {template A(){} };' - 適合我。但是,現在我們有模板課。 – bruziuz 2017-01-20 12:04:23

回答

32

號的C++標準03說:

[注:由於顯式模板參數列表如下函數模板名稱, 因爲轉換成員函數模板和構造成員函數模板被稱爲無使用函數名,也沒有辦法來提供這些功能模板的顯式模板參數列表。](§14.5.2/ 5)

3

不,你不能使用該構造函數實例化那個類。但是:



struct A 
{ 
    template < typename T > 
    A(T const&); 
}; 

現在你可以。

+3

我不太明白答案......它與問題有什麼關係? – 2010-05-18 23:22:58

+2

它顯示了你如何做到這一點。只是碰巧你不能按照問題的方式去做。 – MSN 2010-05-18 23:41:27

+0

太糟糕的評論不能降級。那個很不「很棒」。 – 2010-05-18 23:42:19

8

還有就是模板構造爲transfering類型信息的另一解決方案,它可以」把這種類型的價值看成是一種爭論NT:

template<class T> 
struct id 
{}; 

struct A { 
    template<class T> 
    A(id<T>); 
}; 

A a=id<int>(); 

編輯:

請注意:A a(id<int>());不會起作用,因爲最棘手的解析的。它將被解釋爲函數聲明。進一步的解釋請參見this question

相關問題