次のクラス階層があるとします。
template< class T >
class TestBase {
public:
virtual T const & do_foo() = 0;
};
template< class T >
class TestDerived : public virtual TestBase< T > {
public:
virtual int do_bar() {
return do_foo() + 1;
}
};
GCCは以下を吐き出します:
error: there are no arguments to ‘do_foo’ that depend on a template parameter, so a declaration of ‘do_foo’ must be available [-fpermissive]
note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
ここで、これを既知の型からインスタンス化されたTestBaseから派生するように変更すると(たとえばclass TestDerived : public virtual TestBase< int >
、このスニペットは正常にコンパイルされるため、問題はコンパイル時に基本クラスの型が不明であることに関係しているようです。ただし、オブジェクトをインスタンス化していないためです。どちらのクラスでも、なぜこれが重要なのかわかりません。
基本的に、に頼らずにエラーを解決するにはどうすればよい-fpermissive
ですか?