2012-06-18 33 views
0

我有一個模板類方法類似:問題與調用從模板類的方法

template<class T> 
static tmpClass<T>* MakeInstance(T value) 
{ 

    tmpClass<T> *pointer = new tmpClass<T>(value); 

    return pointer; 
} 

我用各種方式來調用這個方法:

方法1:

MakeInstance<int>(val); // This is OK. 

方式2:

MakeInstance(int val); // ERROR: Expected '(' for function-style cast or type construction 

方式3:

MakeInstance(int (val)); // This is also OK. 

方式4:

MakeInstance(int, (val)); // The same issue with way 2 

方式5:

MakeInstance((int), (val)); // ERROR: Expect expression with "," 

方式6:

MakeInstance((int) val); // This is also OK. 

方式7:

MakeInstance<int val>; // ERROR: Expected ">" 

那麼方法1,3,6之間有什麼區別嗎?爲什麼我們不能使用「,」來拆分「T」和「value」,僅僅是因爲我們必須嚴格遵循模板?但爲什麼我們在「<>」中也可以有「T」?

+3

您應該在模板上閱讀[好書](http://stackoverflow.com/q/388242/21475)。看來你還不清楚基本的語法。 – Cameron

+1

val是什麼類型的?如果它是'int',那麼你可能不需要1,3,6。只需調用MakeInstance(val);'。 – iammilind

+0

@iammilind它有多種類型,如int,short,long,char,string ...我想你正在談論模板中的默認類型。 –

回答

1

#1明確指定你要調用具有指定類型的模板功能。

#3 & #6的函數的調用由函數模板參數推導確定。該轉換告訴編譯器尋找一個函數,它需要一個int,因爲編譯器無法找到它使用模板函數來生成一個函數。

需要注意的是C風格的轉換:

T(val); 

val(T); 

都是相同的,意思是相同的。