2014-10-05 78 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阵列中产生“悬挂指针”。

相关问题