2016-02-15 70 views
0

我看到這個代碼在互聯網上:爲什麼不會這個模板函數編譯C++

template <class T, class S> 
    T f(T& a, T& b, S c) { 
    T t1, t2, t3; 
    if (a==b) return t1; 
    if (c>0) return t2; 
    return t3; 
} 

隨後這些調用:

f('c', 5, 5); // why this doesn't compile? 

f(3, 4, 6.0); // why does this compile? 

第一個沒有編制,而第二確實..爲什麼?

+0

@RSahu燁,編輯。 –

+1

你確定你想在傳遞文字時使用引用嗎? – Matt

+0

模板規範預計參數'a'和'b'應該是相同的類型。他們不是第一個,但他們在第二個。 – andand

回答

4

在C++中(相對於C)'c'char

您的代碼無法編譯,因爲參數T模板參數推導失敗 - 這是不明確的。在f('c', 5, 5)調用的第一個函數參數說它應該是char,第二說它應該是int。你是如何期望編譯器解決這個模糊問題的?

如果你想T == int您可以指定第一個模板參數明確

f<int>('c', 5, 5); 

,或者你可以使用顯式類型轉換

f((int) 'c', 5, 5); 

當然,因爲它已經指出,即使你通過模板參數演繹問題,您仍然無法使用右值初始化非常量左值引用。由於後面的原因,你的兩個電話都是無效的。

+0

但不是''c''一個'int'? –

+4

@meer khan:不,在C++中''c''是'char'。在C它是一個'int',但C++不是C. – AnT

+0

如何右值結合(非常數)'T&'中調用'F(3,4,6.0);'? – Zereges

相關問題