C ++错误:'没有匹配函数来调用[class] :: [function]'

时间:2014-10-05 10:17:54

标签: c++ class templates methods reference

我有一个模板类template <typename T> class MyClass,其方法为:

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)

为什么会这样?

1 个答案:

答案 0 :(得分:5)

您的会员功能需要T的引用,即int&。您传递的是普通int,而不是int类型的变量,其中C ++可以作为参考。这是不允许的:您可以传递int代替常量引用,但不能代替非常量引用。

这样做的原因是,当您传递一个值来代替常量引用时,C ++可以创建一个临时对象,将值复制到该对象中,并将对该临时值的引用传递给函数。对非常量引用执行相同操作将是不正确的,因为您的代码无法访问可能可修改的临时对象。

您的代码说明了这种错误的原因:您将10传递给您的函数,但该函数采用item的地址。 10的地址是什么? C ++不知道,因为整数文字10没有地址。

您可以通过提供int类型的变量,将其设置为10并调用add来修复呼叫:

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

但是,您需要确保thing的范围不会超过ten,否则您最终会得到一个&#34;悬空指针&#34;在data对象的thing数组中。