2011-09-01 124 views
1
#include <iostream> 
using namespace std; 

template <typename x> x functionA (x, x); 

int main() 
{ 
    functionA <double, double, double> (1, 1) << "\n"; 
} 

template <typename x> x functionA (x arg1, x arg2) 
{ 
    return arg1 + arg2; 
} 

該代碼產生:錯誤:呼叫沒有匹配功能

error: no matching function for call to ‘functionA(int, int)’ 

什麼可以的原因是什麼?

回答

1

函數模板只有一個模板參數,你傳遞3模板參數吧:

functionA <double, double, double> (1, 1) << "\n"; 

爲什麼3模板參數?

只要寫:

functionA <double> (1, 1); 

或者你可以簡單地讓編譯器推斷出模板參數,如:

functionA(1.0, 1.0); //template argument deduced as double! 
functionA(1, 1);  //template argument deduced as int! 
+0

不是'functionA '表示返回類型是'double'而其他兩個參數也是'double'? –

+0

@Anisha:第一個函數模板中只有一個* type參數*,它是'x'。同樣的類型被用作函數參數和返回類型。 – Nawaz

+1

@Anisha如果參數的類型相同,則不需要多次指定類型。 – Jagannath

1

這是錯的:functionA <double, double, double> (1, 1)。您正嘗試使用三個模板參數調用functionA(),而functionA的聲明只有1個模板參數。

除此之外,調用後的<< "\n";也沒有任何意義。

2

這裏有兩個錯誤。首先,你只需要指定一個類型的模板:

functionA<double>(1, 1) 

其次,你在該行的開始丟失了的std::cout

1

線應該是,

std::cout << functionA <double> (1, 1) << "\n"; 
^^^^^^^missing   ^^^^^^only 1 argument 

因爲,functionA只需要1個模板參數,因此你應該顯式調用只能使用一個模板參數。

的3個參數需要的情況下已經有過你的functionA很喜歡,

template <typename x, typename y, typename z> 
x functionA (y arg1, z arg2) 
{ 
    return arg1 + arg2; 
} 
+0

請查看我對Nawaz的帖子的評論。 –

+0

@Anisha,查看最新的答案 – iammilind

0

你並不需要多次指定類型。 如果你的返回類型和函數的參數是相同的,那麼你甚至不需要指定類型。下面的代碼編譯得很好。

std::cout << functionA(1, 1) << std::endl;