使用模板的c ++ undefined引用

时间:2012-08-21 21:36:47

标签: 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:
  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文件中执行模板时遇到过问题...但这都在一个文件中。

感谢。

3 个答案:

答案 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()时缺少参数。