我有一个模板类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)
为什么会这样?
答案 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
数组中。