2014-10-05 75 views
2

我有一個模板類template <typename T> class MyClass與方法:C++錯誤:沒有匹配函數調用[類] :: [功能]'

void add (T& item) { 
    data[indexToInsert++] = &item; // data is an array of T* 
} 

在主:

MyClass<int> thing; 
thing.add(10); 

在第二行,我得到這個錯誤:

no matching function for call to MyClass::add(int) 

爲什麼會發生這種情況?

+2

像'T&'這樣的非常量左值引用不能像'10'那樣綁定到右值。無論如何,編譯器應該如何使用'10'的地址? – 2014-10-05 10:20:33

回答

5

您的成員函數期望引用T,這將是int&。您正在傳遞一個普通的int,而不是類型爲int的變量,其中C++可以參考。這是不允許的:您可以傳遞一個int來代替常量引用,但不能代替非常量引用。

原因是,當您傳遞一個值代替常量引用時,C++可以創建一個臨時對象,將該值複製到該對象中,並將該臨時對象的引用傳遞給一個函數。對非常量引用做同樣的事情是不正確的,因爲你的代碼不能訪問潛在可修改的臨時對象。

您的代碼說明了這將不正確的原因:您將10傳遞給您的函數,但函數的地址爲item10的地址是什麼? C++不知道,因爲整數文字10沒有地址。

可以通過提供int類型的變量,將它設置爲10,並調用add固定電話:

MyClass<int> thing; 
int ten = 10; 
thing.add(ten); 

但是,你需要確保thing不會有比ten範圍較廣,因爲否則,您最終會在thing對象的data陣列中產生「懸掛指針」。

相關問題