0

重複の可能性:
C++で継承されたテンプレートクラスは基本クラスにアクセスできません

テンプレートと継承で問題が発生しています。簡単に言うと、別のテンプレートクラスから継承したいテンプレートクラスがあります。基本クラスのメンバーが派生クラス内に表示されない理由がわかりませんか?テンプレートを使用しなくても、すべてが期待どおりに機能します。例えば:

template <typename T>
class Foo
{
public:
    T x;
    T y;
    void doX(){ x = x+1; }
    void doY(){y++;}
protected:
    T a;
    T b;
    void doA(){a++;}
};

template <typename T>
class Bar : public Foo<T>
{
public:
    void doX(){x++; y++;} // ERROR
    void doY(){x++; y++;} // ERROR
    void doA(){a++;b++;}  // ERROR
};
4

4 に答える 4

8

これらの変数は依存する名前なので (詳細についてはThe Dreaded Two-Phase Name Lookupを参照)、次のように使用する必要がありthisます。

void doX(){ this->x++; this->y++; } 

this->暗黙的であるため、通常は必要ありません。しかし、ここでは必須です。実際には明示的に、基本クラスがインスタンス化されるときに、 2 番目this->のフェーズで名前を検索するようにコンパイラに指示します。この場合、2 フェーズの名前検索メカニズムが使用されるためです。

または、次のように基本クラスでそれらを修飾できます。

template <typename T>
class Bar : public Foo<T>
{
    typedef Foo<T> base; //add this friendly typedef!
public:
    void doX(){  base::x++; base::y++;} 
    //...
};

baseこの場合、 ( のtypedefであるFoo<T>) がインスタンス化されるまで名前を参照できないという事実は、私の意見では(人間の目には)より明白になります。

于 2012-07-04T12:36:05.003 に答える
7

基本クラスがテンプレート パラメーターに依存している場合、そのメンバーは派生クラスの定義で直接使用できません。テンプレートがインスタンス化されるまで、コンパイラは基本クラスに何が含まれるかを認識しないため、そこから名前を検索しません。

名前を修飾することで、名前をメンバーとして扱うように強制できます。

void doX(){this->x++; Foo<T>::y++;}  // OK: both forms specify that it's a member
于 2012-07-04T12:37:56.580 に答える
3

派生クラス関数で x, y の代わりに this->x, this->y を記述します。

于 2012-07-04T12:35:57.467 に答える
1

基本クラスのスコープを使用して変数を参照してみてください。

Foo<T>::x

または使用this

this->x
于 2012-07-04T12:37:14.557 に答える