2015-11-24 132 views
1

是否可以使用參數爲返回值專門化模板?我在嘗試執行下面顯示的模板特化時遇到錯誤。所以我現在將這兩個專業聲明爲使用宏來避免重複代碼的不同功能。返回類型參數的函數模板專門化

#include <iostream> 

template<class T1,class T2> 
inline T1 func(const T2& a) { return T1(3.5);} 

template<> 
inline float func(const int& a) { return (1.0); } 

template<> 
inline double func(const float& a) {return (2.0); } 

int main() { 
    func(2); 
    return 0; 
} 

的錯誤是:

temp.cpp:13:3: error: no matching function for call to 'func' 
    func(2);  
    ^~~~ 
temp.cpp:4:11: note: candidate template ignored: couldn't infer template argument 'T1' 
inline T1 func(const T2& a) { return T1(3.5);} 
     ^
1 error generated. 
+0

你會得到什麼錯誤? – user463035818

+1

爲什麼不只是一個超負荷? – AndyG

+1

[無法重現](http://coliru.stacked-crooked.com/a/fbdd4603f59a6613)。 –

回答

3

專門研究返回類型與其他專業化並無太大區別。問題不在於它如何工作,而在於它如何被調用。

template<class T1,class T2> 
inline T1 func(const T2& a) 
{ 
    return T1(3.5); 
} 

func(2); //with T2 = int, what is T1? 

編譯器無法知道返回類型應該是什麼。如果模板參數匹配,專業化是具體說明如何做,所以它仍然首先需要兩個模板參數。如果您指定了第一個模板參數,它將起作用。

func<float>(2); //returns 1.0 

正如在評論中指出的那樣,儘管重載優於專業化。

float func(const int&); 
double func(const float&); 

這樣,它不會卡住猜測返回類型。

+0

謝謝,幫助爲什麼我不能使用模板專門化,因爲我在表達式模板中使用它,我無法給它返回類型參數。正如你在評論中所說的那樣,T2被計算出來,但不是返回類型T1。重載解決方案是我目前使用的宏,我將繼續使用它。 – user1382302

1

錯誤消息告訴你很清楚是什麼問題:

temp.cpp:4:11:注:候選模板忽略:無法推斷模板參數'T1'

您必須明確提供模板參數:

int main() { 
    func<float,int>(2); 
    return 0; 
} 

原因是編譯器無法推斷出您要使用的返回類型。 T2可以根據您傳遞的參數來確定,但是對於T1任何類型都會進行匹配,因此編譯器無法做出決定。

+0

這不是重點。我通過給它一個int func(2)來指定模板參數,它應該選擇int版本。 func(2.0f)應該選擇其他。重載版本正確但沒有專業化。這是爲什麼?這是我想知道的。 – user1382302

+0

@ user1382302爲什麼我不知道,但多數民衆贊成在錯誤說:無法推斷模板參數。通常這可以通過陳述參數來解決。 – user463035818

+0

@ user1382302以及您的意思是「那不是重點」。 ?當你像我建議的那樣做時,錯誤消失了([剛試過](https://ideone.com/DVPJZ1)) – user463035818