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

Avi*_*ohn 2 c++ methods templates reference class

我有一个template <typename T> class MyClass带有方法的模板类:

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

主要:

MyClass<int> thing;
thing.add(10);
Run Code Online (Sandbox Code Playgroud)

在第二行,我收到此错误:

no matching function for call to MyClass::add(int)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

das*_*ght 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);
Run Code Online (Sandbox Code Playgroud)

但是,您需要确保thing不会有更大的范围ten,因为否则您最终会datathing对象的数组中使用"悬空指针" .