gpt4 book ai didi

c++ - 对模板的`vtable 的 undefined reference

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:41 25 4
gpt4 key购买 nike

我有一个继承自接口(interface)类的模板类,因此具有虚函数

//abstract.h
class Abstract {
virtual void abc();
Abstract();
}
//Abstract.cpp
Abstract::Abstract()
{ //do some init}

//concrete.h
class Impl {
public:
void abcImpl();
};

template<typename T>
class Concrete : public Abstract, public T {
virtual void abc();
};
template<typename T>
Concrete<t>::abc() { static_cast<T>(*this).abcImpl(); }

//concrete.cpp
void Impl::abc() { std::cout << "abc"; }

在这里使用

//foo.cpp
Concrete<Impl> *var1 = new Concrete<Impl>();

在链接时,我得到一个错误 未定义的对“抽象 vtable”的引用

过去,此错误表明编译器无法找到放置 vtable 的位置,因为没有与该类关联的 cpp 文件。换句话说,它将 vtable 放在它首先找到任何成员函数的第一个非虚拟定义的位置。但这是令人费解的,因为。1. 我不确定它为什么提示 Abstract - Abstract 实际上有一个 cpp2.也许错误消息实际上意味着具体?但是混凝土不能在 cpp 文件中,因为它是模板化的。那么在处理也具有虚函数的模板类时,通常如何解决这个问题?

最佳答案

问题可能是由于 abc() 方法未声明为纯虚拟。例如,GCC 将使用 abc() 作为 vtable 放置的关键方法,因为它是类中声明的第一个非内联、非纯虚方法(详情:http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html)。如果您声明 abs() 纯虚拟,​​它应该将 vtable 放在定义构造函数的 Abstract.cpp 中。

关于c++ - 对模板的`vtable 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9235284/

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