C++ 抽象基础模板 Class 非 Void 方法

C++ Abstract Base Template Class Non-Void Method

我有一个包含成员函数的抽象基础模板 class,其中一些是 void,其他 returning 数据类型范围从原始数据类型到模板参数数据类型。我还是 C++ 的新手,我知道我不一定要在基础 class 中实现纯虚函数,除非我希望在派生的 class 中调用它们。这个想法适用于没有 return 值的成员函数。对于一个 returned 一个整数的函数,我 returned 一个 0。但是当我得到一个 returned 对模板参数 T 的引用的函数时,我不知道该怎么办。我尝试了以下两个 returns.

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
}

这里是一个纯虚函数和实现它的派生 class 的示例(为清楚起见省略了一些成员函数):

template <class T>
class Base
{
   public:
     virtual T& get() = 0;
     virtual ~Base() = 0;
};

template <class T>
Base<T>::~Base() {}

template <class T>
class Derived: public Base<T>
{
   T t;
   public:
     T& get() override { return t; }
};

请注意 Base 中的 get() 没有实现,Derived 中的 get 的实现使用了 Base 中不可用的新数据成员.

另请注意,纯虚 析构函数 与其他纯虚函数不同, 必须 具有实现。但是,如果 class 中还有其他纯函数,通常不需要纯虚拟析构函数。此处显示是为了说明。