template<class D>
class Animal{
public:
D a;
Animal(){
a=0;
}
};
template<class D>
Animal<D>& addAnimal(Animal<D>& ans, const Animal<D>& a, const Animal<D>& b){
ans.a = a.a + b.a;
return ans;
}
//an overloaded simpler method for the one above
template<class D>
Animal<D> addAnimal(const Animal<D>& a, const Animal<D>& b){
return addAnimal( Animal<D>(),a,b);
}
int main() {
Animal<int> a;
Animal<int> b;
Animal<int> c = addAnimal(a,b);
}
以下不编译。为什么不?我知道我可以通过按值传递 ans
参数或通过以下方式更改对该方法的调用来解决此问题:
template<class D>
Animal<D> addAnimal(const Animal<D>& a, const Animal<D>& b){
Animal<D> ans;
return addAnimal(ans,a,b);
}
我想更好地理解按引用传递以及如何调用堆栈对象的默认构造函数。 谢谢!
最佳答案
线
return addAnimal( Animal<D>(),a,b);
不起作用,因为 Animal<D>()
是一个临时对象,不能在需要非 const
的函数调用中使用左值引用。
更重要的是,我不清楚为什么你需要重载
template<class D>
Animal<D>& addAnimal(Animal<D>& ans, const Animal<D>& a, const Animal<D>& b) { ... }
您可以实现更简单的两个参数函数:
template<class D>
Animal<D> addAnimal(const Animal<D>& a, const Animal<D>& b){
Animal<D> ans;
ans.a = a.a + b.b;
return ans;
}
并完全摆脱另一个。
关于C++ 传递临时堆栈对象作为对函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58946654/