2017-09-17 28 views
2

私は奇妙なエラーが発生していて、何が間違っているのか分かりません。テンプレートを継承した継承継承メンバ

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のフルネームを参照している場合、コードはのように、コンパイルようですか?

+0

これは役に立ちますが、MSVCにはこれをコンパイルする拡張機能があります。 :o – wally

+1

MSVCは常にシングルパスでした。彼らは**ただ**標準に準拠するように変更しました。 https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/ –

+0

言語拡張機能を無効にすると、MSVCでエラーが発生します。したがって、少なくとも準拠した動作が利用可能です。 – wally

答えて

2

コンパイラはxの検索方法がわかりません。 this->Xを使用すれば正常に動作します。

コンパイラがstruct Bを最初に通過した時点で、テンプレートパラメータはわかりません。 thisポインターを使用すると、2回目のパスまで名前ルックアップを延期します。

+0

ああ、そうですね、これについて忘れました。ダムの質問、私は知っている。ありがとう。 – Svalorzen