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ファイルでテンプレートを実行するときに問題が発生したことがありますが、これはすべて1つのファイルに含まれています。

ありがとう。

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()の実装を提供していませんB。例:

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

他にもコンパイルエラーがあることに注意してください。クラスBの本体の後にセミコロンがなく、。の呼び出しで引数がありませんGo()

于 2012-08-21T21:39:25.873 に答える