0

所以我有以下代码:

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 文件中制作模板时遇到过问题......但这都在一个文件中。

谢谢。

4

3 回答 3

2
  • virtual void Destroy(T obj);没有实施。实现它或将其标记为虚拟纯= 0

  • ;在定义之后没有X

  • a.Go();错了,Go应该带个参数。

于 2012-08-21T21:38:26.113 回答
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) { }
//^^^^^
于 2012-08-21T21:40:56.833 回答
0

您还没有提供Destroy()in 的实现B,例如:

template<class T>
void A<T>::B::Destroy(T a) {
  // do something
}

请注意,您还有其他编译错误:B 类主体后缺少分号,调用Go().

于 2012-08-21T21:39:25.873 回答