2012-05-24 9 views
7

宣言されていない識別子を使用すると、次のコードをコンパイルできません。コンパイルには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. 
} 

誰でも説明がありますか? ありがとうございます!

+0

@juaすなわちaddStuffメソッドを呼び出すには、このポインタ修飾されていない名前に関する呪われた依存ベース参照ルールを参照する必要があります。あなたの言うことは間違っています。適合するコンパイラがそれを必要とします。 –

答えて

14

this->addStuff(thingy); 
+1

はい、これはそうです;) – user1414745

+0

@ juanchopanza:実際には、コンパイラは依存していないので、これは正しいです。 –

+1

@mooそれは確かに*依存しており、インスタンス化時に検索されます。 –

5

を試してみてくださいいくつかの問題があります。

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

it seems to workを修正した後。

編集:構文エラーを修正してもまだ動作しません。他の人が提案してきたように、あなたのコンパイラは、this->プレフィックスでaddStuffメソッドを呼び出すことが必要な場合があります:それはテンプレートの継承のためにだ

this->addStuff(thingy); 
+1

私はそれが標準としては機能しないはずだと思います。 'this->'部分はここでの要件です。 – Nawaz

+0

@Nawaz:MSVC2010も機能します。それがうまくいかない理由から標準からの引用を投稿できますか? –

+0

@Nawaz:いいえ、この場合の要件ではありません。詳細はあなたの答えに私のコメントを参照してください。 –

2

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

するか、このポインタでそれを行う:このような場合、あなたはmannualy基本法のために使用して指定する必要があります

template <typename T> 
MyDerived<T>::doSomething() { 
    T* thingy = new T(); 
    this->addStuff(thingy); 
} 
1

使用

this->addStuff(thingy); 
関連する問題