6

重複の可能性:
なぜこのポインターを介してテンプレート基本クラスのメンバーにアクセスする必要があるのですか?

次のようなクラス階層があります。

template<typename T>
class Base {
protected:
    T t;
};

template<typename T>
class Derived: public Base<T> {
public:
    T get() { return t; }
};

int main() {
    Derived<int> d;
    d.get();
}

問題は、保護されたメンバー変数tがBaseクラスに見つからないことです。コンパイラ出力:

prog.cpp: In member function 'T Derived<T>::get()':
prog.cpp:10:22: error: 't' was not declared in this scope

それは正しいコンパイラの動作ですか、それとも単なるコンパイラのバグですか?それが正しければ、なぜそうなのですか?最善の回避策は何ですか?

完全修飾名の使用は機能しますが、不必要に冗長になっているようです。

T get() { return Base<T>::t; }
4

1 に答える 1

5

テンプレート基本クラスのメンバーを使用するには、プレフィックスとして。を付ける必要がありますthis->

template<typename T>
class Derived: public Base<T> {
public:
    T get() { return this->t; }
};
于 2012-11-12T11:44:20.320 に答える