一部のWindowsのレガシーコードを移植し、私は完全には理解していない次のような問題に遭遇したのgcc /打ち鳴らすとコンパイルするためにそれを取得しようとしている間:構文パズル
template<typename T> class Base
{
public:
Base() {}
T m_var;
};
template<typename T> class Derived : public Base<T>
{
public:
Derived()
{
#if 1
Base<T>::m_var = 0; // fix - compiles with gcc/clang now
#else
m_var = 0; // original - compiles only with MSVC++
#endif
}
};
のgcc /打ち鳴らすの誤差は次のとおりです。
error: use of undeclared identifier 'm_var'
は、残念ながら、修飾されていないメンバ変数は、派生クラスのメソッドで参照されている場所の何百もある、と私は本当にそのように、これらすべてを変更する必要がありますする必要はありません彼らはの資格を持っていますもし私がそれを助けることができれば。
gcc/clangがMSVC++で必要としない理由を誰もが説明でき、可能な回避策を提案できますか?
簡潔な説明をお寄せいただきありがとうございます。おそらくMSVC++は苦情なしでこれをコンパイルするのに間違っていますか? –
@PaulR可能性が高い、はい。数年前、g ++はこの種のコードについては不平を言っておらず、ルールの実行を開始したときに同様のコードを修正しなければならないことを漠然と思い出しました。 – anderas
@PaulRええ、それは二相検索の欠如のためです。メンバーはインスタンス化時に検索され、テンプレート定義がAFAIKにチェックされると無視されます。 – TartanLlama