16

次のコードはコンパイルできません - 宣言されていない識別子が使用されています。コンパイルには GCC と XCode を使用します。

すべてが単一のヘッダー ファイルにあります。

include "MyArray.h"

template <typename T>
class MyBase {
public:
  MyBase();
  virtual ~MyBase();
  void addStuff(T* someStuff);
protected:
  MyArray<T*> stuff;
};

template <typename T>
MyBase<T>::MyBase() {}
template <typename T>
MyBase<T>::~MyBase() {}

template <typename T>
void MyBase<T>::addStuff(T* someStuff) {
  stuff.add(someStuff);
}

// ---------------------

template <typename T>
class MyDerived : public MyBase<T> {
public:
  MyDerived();
  virtual ~MyDerived();
  virtual void doSomething();
};

template <typename T>
MyDerived<T>::MyDerived() {}
template <typename T>
MyDerived<T>::~MyDerived() {}

template <typename T>
void MyDerived<T>::doSomething() {
  T* thingy = new T();
  addStuff(thingy); //here's the compile error. addStuff is not declared.
}

誰か説明がありますか?前もって感謝します!

4

4 に答える 4

34

試す

this->addStuff(thingy);
于 2012-05-24T10:29:23.043 に答える
7

これはテンプレートの継承によるものです。このような場合、ベース メソッドを使用して手動で指定する必要があります。

template <typename T>
MyDerived<T>::doSomething() {
  using MyBase<T>::addStuff;
  T* thingy = new T();
  addStuff(thingy); 
}

または、このポインタでそれを行います:

template <typename T>
MyDerived<T>::doSomething() {
  T* thingy = new T();
  this->addStuff(thingy); 
}
于 2012-05-24T10:33:18.477 に答える
6

いくつかの問題があります。

  1. クラス定義の後にセミコロンがありません。
  2. doSomethingメソッドの宣言/定義の型がありません。
  3. addStuffメソッドの定義の型がありません。

それがうまくいくように修正した後。

編集:構文エラーを修正しましたが、まだ機能しません。他の人が示唆しているように、コンパイラは接頭辞を付けてaddStuffメソッドを呼び出す必要があるかもしれません:this->

this->addStuff(thingy);
于 2012-05-24T10:32:29.370 に答える
3

このポインターを使用して addStuff メソッドを呼び出します。

this->addStuff(thingy);
于 2012-05-24T10:34:32.953 に答える