C++ c++;使用模板的未定义引用
因此,我有以下代码:C++ c++;使用模板的未定义引用,c++,templates,C++,Templates,因此,我有以下代码: 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:
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;
}
模板
甲级
{
公众:
B类
{
公众:
虚拟空洞破坏(T-obj);
};
B&U B;
甲(乙):(乙)
{
}
无效Go(T obj)
{
_b、 销毁(obj);
}
};
类别X:公共A::B
{
公众:
无效销毁(int x)
{
//做点什么
}
};
int main()
{
X;
A(x);
a、 Go(5);
返回0;
}
但我得到一个编译错误:
undefined reference to 'A<int>::B::Destroy(int)'
对“A::B::Destroy(int)”的未定义引用
我以前见过在单独的.hpp和.cpp文件中执行模板时出现的问题。。。但这些都在一个文件中
谢谢。虚拟空洞破坏(T-obj)代码>未实现。实现它或将它标记为虚拟纯
=0
- 没有
定义
X
错误,a.Go()
应采用参数Go
虚拟空洞破坏(T-obj)代码>未实现。实现它或将它标记为虚拟纯
=0
- 没有
定义
X
错误,a.Go()
应采用参数Go
B
中提供Destroy()
的实现,例如:
template<class T>
void A<T>::B::Destroy(T a) {
// do something
}
模板
作废A::B::销毁(TA){
//做点什么
}
请注意,您还有其他编译错误:在类B的主体之后缺少分号,在调用
Go()
中缺少参数。您尚未在B
中提供Destroy()
的实现,例如:
template<class T>
void A<T>::B::Destroy(T a) {
// do something
}
模板
作废A::B::销毁(TA){
//做点什么
}
请注意,您还有其他编译错误:在类B的主体之后缺少分号,在调用
Go()
时缺少参数,为虚拟无效销毁(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. */ }
添加虚拟空洞破坏(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. */ }
太棒了,谢谢!我忘记了=0
使其成为纯虚拟。哦,天哪,我一生都在拼写“alternative”(交替)错误:(太棒了,谢谢!我忘记了=0
使其成为纯虚拟。哦,天哪,我一生都在拼写“alternative”:(