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)
为什么会这样?
您的成员函数需要引用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
,因为否则您最终会data
在thing
对象的数组中使用"悬空指针" .