私は奇妙なエラーが発生していて、何が間違っているのか分かりません。テンプレートを継承した継承継承メンバ
template <bool X>
struct A {
int x;
};
template <bool X>
struct B : public A<X> {
B() { x = 3; } // Error: 'x' was not declared in this scope.
};
私はそれは私が公にA
を継承してることを考えると、私はB
からx
を見ることができない可能性がありますどのように理解していません。
同時に、このコードはコンパイルされます。
template <bool X>
struct A {
int x;
};
template <bool X>
struct B : public A<X> {};
int main() {
B<false> b;
b.x = 4;
};
私はG ++ 7.0.1でコンパイルしています。
編集:
B() { A<X>::x = 3; }
しかし、なぜ:それは私がx
のフルネームを参照している場合、コードはのように、コンパイルようですか?
これは役に立ちますが、MSVCにはこれをコンパイルする拡張機能があります。 :o – wally
MSVCは常にシングルパスでした。彼らは**ただ**標準に準拠するように変更しました。 https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/ –
言語拡張機能を無効にすると、MSVCでエラーが発生します。したがって、少なくとも準拠した動作が利用可能です。 – wally