【发布时间】:2017-03-22 06:48:12
【问题描述】:
我有一个包含成员函数的抽象基模板类,其中一些是 void,另一些则返回从原始数据类型到模板参数数据类型的数据类型。我还是 C++ 新手,我知道我不一定要在基类中实现纯虚函数,除非我希望在派生类中调用它们。这个想法适用于没有返回值的成员函数。对于一个返回整数的函数,我返回了一个 0。但是当我到达一个返回对 T(模板参数)的引用的函数时,我不知道该怎么办。我尝试了以下两个返回。
template <typename T>
T& AbstractBaseClass<T>::function(){
return T();
}
和
template <typename T>
T& AbstractBaseClass<T>::function(){
return T& tmp= T();
}
但两者似乎都不起作用,我不能不定义这些函数,因为我得到了一个未定义的函数引用错误。我认为这个错误是因为函数是模板。实现非 void 纯虚函数的合适方法是什么?
template <typename T>
class AbstractBaseClass{
public:
virtual ~AbstractBaseClass() = 0;
T& function();
}
template <typename T>
T& AbstractBaseClass<T>::function(){
//what must I do here when I don't have any member variable
}
【问题讨论】:
-
问题是你试图返回一个对 temporary 对象的引用。想一想当该临时对象被破坏(立即)时会发生什么,那么引用将引用什么?
-
抽象基类可能没有成员变量,但你的具体派生类肯定需要一个。
-
@Someprogrammerdude 因此,我在源文件中的函数头应该是“virtual T& AbstractBaseClass
::function()=0”?我无法这样做,因为我收到一条错误消息,提示“模板可能不是‘虚拟’” -
叹息。 “当我没有任何成员变量时我必须在这里做什么”的答案是返回一个局部静态变量,返回一个全局变量,或者几乎,你不能。阅读右值、左值、临时值和引用。
-
删除整个
template <typename T> T& AbstractBaseClass<T>::function(){}部分,你不需要它。
标签: c++ templates pure-virtual