所以我有以下代码:
template<class T>
class A
{
public:
class B
{
public:
virtual void Destroy(T obj);
};
B &_b;
A(B b) : _b(b)
{
}
void Go(T obj)
{
_b.Destroy(obj);
}
};
class X : public A<int>::B
{
public:
void Destroy(int x)
{
//do something
}
};
int main()
{
X x;
A<int> a(x);
a.Go(5);
return 0;
}
但是我收到编译错误:
undefined reference to 'A<int>::B::Destroy(int)'
我之前在单独的.hpp和.cpp文件中执行模板时遇到过问题...但这都在一个文件中。
感谢。
答案 0 :(得分:2)
virtual void Destroy(T obj);
未实施。实现它或将其标记为虚拟纯= 0
;
X
a.Go();
错误,Go
应该带参数。
答案 1 :(得分:1)
为virtual void Destroy(T obj);
添加定义:
就位:
class B
{
public:
virtual void Destroy(T obj) { /* here! */ }
// ==== ALTERNATIVELY: ====
virtual void Destroy(T obj) = 0; // pure-virtual
};
或之后:
template <typename T>
void A<T>::B::Destroy(T obj) { /* here. */ }
无论如何,A
的构造函数应该引用:
A(B & b) : _b(b) { }
//^^^^^
答案 2 :(得分:0)
您尚未在Destroy()
中提供B
的实施,例如:
template<class T>
void A<T>::B::Destroy(T a) {
// do something
}
请注意,您还有其他编译错误:在B类主体后面缺少分号,在调用Go()
时缺少参数。