gpt4 book ai didi

c++ - 模板化类的非模板化接口(interface) C++

转载 作者:行者123 更新时间:2023-11-28 08:02:01 24 4
gpt4 key购买 nike

我有一个模板化类的层次结构,它们在一个地方构建,然后传递到其他地方以对它们执行一些操作。

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

但是,我不想将此类型作为模板类传递,因为实用程序函数应该适用于任何具体类变体,因为它们都可以将自己表示为 double。因此,我想要一些具有“表示为 double ”功能的非模板化接口(interface)。为什么以下不起作用?

#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())不能保持未实现状态,如果该类型或其子类型的对象已实例化。
因为,当对象被实例化时,需要将virtual函数的地址/定义填充到隐藏的类成员vptr中,而没有找到,从而导致链接器错误。

要么您必须定义它们的主体,要么将其设为纯虚拟 函数(这样定义就变得可选了)。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com