我有一个在一个地方构造的模板化类层次结构,并将其传递到其他地方以对它们进行一些操作。

例如,可以将一个类模板化为某个复杂的对象,该对象知道如何将其自身转换为double型,并且该模板化的类具有将该对象输出为double型的操作。实用程序函数的一个示例是将此类的集合作为表输出的函数。

但是,我不想将这种类型作为模板化类进行传递,因为实用程序功能应该可以在任何具体的类变体上工作,因为它们都可以将自己表示为double。因此,我想使用一些非模板化的接口,该接口具有“以double表示”功能。为什么以下方法不起作用?

#include "stdafx.h"

class Interface1
{
public:
    virtual int ReturnSomeInt();
};

template<typename myType>
class TClass1 : public Interface1
{
public:
    int ReturnSomeInt() {return 5;}
    void CalculateSomething(myType myValue) {}

    TClass1() {}
};

//---------------------------------------------

class Interface2 : public Interface1
{
public:
    virtual double ReturnSomeDouble();
};

template<typename myType>
class TClass2 : public TClass1<myType>, public Interface2
{
public:
    double ReturnSomeDouble() {return 9.2;}
    void CalculateSomethingElse(myType myValue) {}

    TClass2() {}
};

//---------------------------------------------

int _tmain(int argc, _TCHAR* argv[])
{
    Interface2 myInterface = TClass2<float>();
    int myInt = myInterface.ReturnSomeInt();
    double myDouble = myInterface.ReturnSomeDouble();
    return 0;
}


我收到一个链接错误2019,因为它找不到符号Interface2::ReturnSomeDouble(void)。可能是什么问题呢?

最佳答案

如果实例化该类型的对象或其子类型,则virtual函数(此处为Interface2::ReturnSomeDouble())不能保持未实现。
因为,当实例化对象时,它需要用vptr函数的地址/定义填充隐藏的类成员virtual,这未找到,从而导致链接器错误。

您要么必须定义它们的主体,要么使其成为纯virtual函数(这样定义就成为可选的)。

关于c++ - 非模板化类的接口(interface)c++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11185680/

10-10 16:36