次のようなクラス階層があります。
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; }