2012-08-08 102 views
4

我有一個被定義爲功能如下:沒有匹配的函數調用模板函數與常量參數

template < class T> T doSomething(const T value, const T value2, const T value3) 
{ 
    T temp = value; 
     //Do stuff 
    return temp ; 
} 
在我的主

,我去把它叫做如下:

doSomething(12.0, 23.0f, 2.0f); 

我得到一個錯誤說沒有匹配函數調用doSomething(double, float, float)

我試着用const_cast,但似乎沒有解決這個問題。任何幫助,將不勝感激。

回答

6

您的函數定義對三個參數中的每一個使用相同的類型「T」。 C++無法在這種情況下扣除類型。

請選擇方法來解決:

  • 不同類型的每一個參數呼叫
 template<typename A, typename B, typename C> 
    A doSomething(const A& value, const B& value2, const C& value3) 
    { 
     A temp = value; 
     //Do stuff 
     return temp ; 
    }
  • 顯式模板參數:
 doSomething<int>(12.0, 23.0f, 2.0f);
  • 顯式類型轉換爲參數的通話:
 doSomething(12.0, static_cast<double>(23.0f), static_cast<double>(2.0f));
8

這不是關於const,而是關於那個T不能同時是doublefloat

如果您有一個非模板函數,可以將一個或多個參數提升(或轉換)爲參數類型。使用模板函數時,編譯器必須首先確定模板類型應該是什麼。在這裏它不能決定。

+0

注意,另一種選擇是定義了三種模板類型T1,T2,T3三個函數的參數,如果這是有道理在這種情況下。 – leemes 2012-08-08 16:54:45

+0

啊,好的,非常感謝你! – user1496542 2012-08-08 16:57:34

+4

@leemes:或者,避免類型推導並調用特定的專業化:'doSomething (12.0,23.0f,2.0f)',這將使得參數的推廣與非模板相同(即,促進/不推廣是類型扣除失敗,而不是它是一個模板) – 2012-08-08 16:59:01

0

使用模板化函數時,需要在尖括號內提供模板參數。

I.e.你需要使用doSomething<float>(12.0, 23.0f, 2.0f);

或者,至少,如果你不這樣做,編譯器猜測T是,當它看到一個double因爲它假定你的意思是doSomething<double>()

+0

匿名和uncommented downvote。我很想知道這裏的問題是什麼。 – KRyan 2012-08-08 16:53:39

+0

你們傢伙的建議解決了這個問題。謝謝! – user1496542 2012-08-08 16:57:53

0

當第一個參數,這意味着你叫這樣的:

doSomething(12.0, 23.0f, 2.0f); 

,那麼你基本上讓編譯器推斷模板參數T,從功能參數。但是,在上述通話,所有的參數類型是不一樣的:第一個參數是12.0double,而其餘的兩個參數是float注意f2.0f使它成爲float,而2.0double)。因此,這個問題,因爲編譯器試圖找到一個接受double, float, float作爲參數的函數。但是沒有這樣的功能。並且函數模板不能從參數中推導出來,因爲對於所有參數,T必須是相同的

所以解決的辦法是,讓T可以推導出兩種doublefloat

doSomething(12.0f, 23.0f, 2.0f); //all are float now 

或者這樣:

doSomething(12.0, 23.0, 2.0); //all are double now 

在第一種情況下,T被推斷爲float,並在第二種情況下,T推導爲double

或者,您也可以選擇依賴於模板參數推導,通過提供模板參數爲:

doSomething<float>(12.0, 23.0f, 2.0f); 

或者這樣:

doSomething<double>(12.0, 23.0f, 2.0f); 

這裏,在第一種情況,第一個參數轉換爲float,在第二種情況下,第二個和第三個參數轉換爲double