サブクラスから保護されたメンバーへのアクセス:gcc vs msvc
-
10-07-2019 - |
質問
ビジュアルC ++では、次のようなことができます:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
これをg ++でコンパイルしようとすると、エラーが発生します。これをしなければなりません:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
前者を標準C ++でやるべきではないのですか?または、gccの設定が間違っていてエラーが発生しますか?
解決
これは以前は許可されていましたが、 gcc 3.4 で変更されました。
テンプレート定義では、非修飾名は依存ベース(C ++標準の[temp.dep] / 3で指定されている)のメンバーを検出しなくなります。たとえば、
template <typename T> struct B {
int m;
int n;
int f ();
int g ();
};
int n;
int g ();
template <typename T> struct C : B<T> {
void h ()
{
m = 0; // error
f (); // error
n = 0; // ::n is modified
g (); // ::g is called
}
};
名前を従属させる必要があります。接頭辞にthis-&gt;を付けます。 C :: hの修正された定義は次のとおりです。
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
他のヒント
これを考え出した:
- C ++ Super FAQ:&quot;なぜエラーが発生するのですか? template-derived-classは、template-base-classから継承するネスト型を使用しますか?&quot;
- C ++ Super FAQ:&quot;なぜエラーが発生するのですか? template-derived-classは、template-base-classから継承するメンバーを使用しますか?&quot;
明らかに、最初の例ではC ++が有効ではなく、msvcがこれを使用するのは悪いことです。 C ++ faq liteにソリューションが投稿されています。
所属していません StackOverflow