宣言されていない識別子を使用すると、次のコードをコンパイルできません。コンパイルにはGCCとXCodeを使用します。C++でテンプレートと継承を使用して宣言されていない識別子を使用する
すべてが1つのヘッダーファイルにあります。
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.
}
誰でも説明がありますか? ありがとうございます!
@juaすなわちaddStuffメソッドを呼び出すには、このポインタ修飾されていない名前に関する呪われた依存ベース参照ルールを参照する必要があります。あなたの言うことは間違っています。適合するコンパイラがそれを必要とします。 –