exc*_*bur 6 c++ virtual templates
我有一个模板类,它继承自接口类,因此具有虚函数
//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"; }
Run Code Online (Sandbox Code Playgroud)
在这里使用
//foo.cpp
Concrete<Impl> *var1 = new Concrete<Impl>();
Run Code Online (Sandbox Code Playgroud)
在链接时,我得到一个错误未定义的引用`vtable for Abstract'
在过去,此错误表明编译器无法找到放置vtable的位置,因为没有与该类关联的cpp文件.换句话说,它将vtable放在首先找到任何成员函数的第一个非虚拟定义的位置.但这令人费解,因为.1.我不知道为什么它抱怨抽象 - 抽象实际上有一个cpp 2.也许错误消息实际上意味着具体?但是Concrete不能在cpp文件中因为它的模板化.那么在处理同样具有虚函数的模板类时,一般如何解决这个问题呢?
该问题可能是由于该abc()方法未声明为纯虚拟造成的。例如,GCC将使用abc()作为vtable放置的关键方法,因为它是类中声明的第一个非内联、非纯虚拟方法(详细信息:http://gcc.gnu.org/onlinedocs/gcc/Vague -Linkage.html)。如果声明abs()纯虚函数,则应将 vtable 放置在定义构造函数的 Abstract.cpp 中。