具有虚拟成员的模板类:链接器错误

时间:2016-11-05 16:00:26

标签: c++ templates abstract-class template-specialization virtual-functions

请考虑以下代码。 A是一个抽象的泛型类; B都实现并专门化它。这段代码对我来说似乎很正确,但由于某种原因,我最终会遇到奇怪的链接器错误。

template<typename T>
class A {
    public:
        virtual void f();
};

class B : public A<int> {
    public:
        void f() {};
};

int main(int argc, char** argv) {
    auto b = new B();
    return 0;
}

gcc输出:

/tmp/ccXG2Z8A.o:(.rodata._ZTV1AIiE[_ZTV1AIiE]+0x10): undefined reference to `A<int>::foo()'
collect2: error: ld returned 1 exit status

clang输出:

/tmp/l2-2a09ab.o: In function `main':
l2.cpp:(.text+0x35): undefined reference to `operator new(unsigned long)'
/tmp/l2-2a09ab.o:(.rodata._ZTI1AIiE[_ZTI1AIiE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
/tmp/l2-2a09ab.o:(.rodata._ZTI1B[_ZTI1B]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/l2-2a09ab.o:(.rodata._ZTV1AIiE[_ZTV1AIiE]+0x10): undefined reference to `A<int>::foo()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

2 个答案:

答案 0 :(得分:1)

A不是抽象类。你应该这样做:

String n = number + " ";

使其成为纯虚函数

答案 1 :(得分:1)

从gcc输出中,我假设您的函数名为foo,而不仅仅是f

问题是类A不是抽象的,因为你还没有声明它的方法。你会这样做:

virtual void foo() = 0;

但是你忘记了= 0,所以链接器并不知道该方法是抽象的,因此正在寻找一个不存在的函数体。