假设我有一个类模板A
,并且非模板类B
继承自A
. 虽然A
编译正常,但编译B
会触发链接器错误。具体来说,
A.hpp
#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED
template <typename T>
class A {
public:
A();
A(A<T>&& );
virtual ~A();
/* ... */
protected:
T x;
};
#include A.tpp
#endif
tpp
#include "A.hpp"
template <typename T>
A<T>::A() { ... }
template <typename T>
A<T>::A(A<T>&& other)
: x(std::move(other.x)) { }
template <typename T>
A<T>::~A() { ... }
测试A.cpp
#include "A.hpp"
int main() {
A<std::string> a;
/* ... */
return 0;
}
编译testA.cpp
成功如下:
$ g++ -std=c++11 testA.cpp
<- 好的
接下来是非模板class B
继承自A
:
B.hpp
#ifndef B_HPP_INCLUDED
#define B_HPP_INCLUDED
#include "A.hpp"
class B
: public A<std::string> {
public:
B();
virtual ~B();
static A<std::string> foo();
};
#endif
B.cpp
#include "B.hpp"
B::B()
: A(std::move(foo())) { }
B::~B() { }
A<std::string> B::foo() { ... }
测试B.cpp
#include "B.hpp"
int main() {
B b;
/* ... */
return 0;
}
编译testB.cpp
似乎没问题,但链接器不是一个快乐的露营者:
尝试 1
$ g++ -std=c++11 testB.cpp
Undefined references to B(), and ~B()
collect2: error: ld returned 1 exit status
尝试 2
$ g++ -std=c++11 testB.cpp B.cpp
Undefined reference to B.foo()
collect2: error: ld returned 1 exit status
非常感谢任何帮助/想法。先生ld
让我彻夜难眠,威胁着我的理智。
编辑
谢谢迈克·西摩!这个最小的例子并不是真实代码的真实再现,因为在实现中确实缺少一个限定符,并且是齿轮中的扳手。