[英]C++ inheritance, templates, and override
我在规范与模板类的接口时遇到了一些麻烦。 为什么会编译以下内容?
class IFoo {
public:
virtual void functionA()=0;
};
template<class T>
class Foo : public IFoo{
public:
void functionA() override { };
void functionB() override { };
};
functionB在IFoo中显然不存在,那么为什么编译器不抛出错误? 目前正在GCC 5.4上运行。
关于我如何处理此问题的一些背景知识:我正在为我的一个副项目编写一些代码,该代码在很大程度上取决于常见的线性代数例程。 我想对库的选择进行抽象,以例如促进基准测试。 想法是使用类似IFoo的接口来执行此操作,以便业务逻辑代码仅了解IFoo,而不必适应任何单个线性代数库的怪癖。 这是可行的,因为仅需要几个关键功能。 我不想为所有可用的操作提供接口。 我需要模板,以允许使用不同精度的处理,例如,浮点数,双精度数,小浮点数等由同一子类处理。
在我看来,针对此问题的明智设计是使用此接口在单独的编译单元中重新包装对这些库的访问,以生成实现此接口的独立静态库或运行时库。 从一个库到另一个库的交换就像链接到所需库一样简单。 无需更改代码。 任何对此总体策略的想法也表示赞赏!
仅当其他一些代码使用模板时,才会实例化模板。 您的示例没有该代码,因此无论是否编译都没有关系。 尝试创建Foo<int>
的对象,然后亲自查看GCC会抱怨。
您仅定义了一个类模板,但没有实例化它。 模板参考摘录:
类模板本身不是类型,对象或任何其他实体。 从仅包含模板定义的源文件中不会生成任何代码。 为了显示任何代码,必须实例化模板:
如果尝试使用以下方法实例化对象:
int main() {
std::unique_ptr<IFoo> p = std::make_unique<Foo<void>>();
}
那么GCC会抱怨:
错误:“ void Foo :: functionB()[with T = void]”标记为“ override”,但未覆盖
void functionB()覆盖{};
关于Coliru的实时示例
虽然以上尝试在VS上编译,但您尝试使用以下方法调用成员函数:
p->functionB();
您将收到以下错误:
'functionB':不是'IFoo'的成员
类“ IFoo”没有成员“ functionB”
话虽如此,目前尚不清楚您实际上在模板中的哪个位置使用模板。 如果删除了template<class T>
您将首先得到您期望的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.