2017-03-16 14 views
7

奇妙な状況に遭遇しました。そこでは、派生したクラスが、テンプレートが関与する基本クラスのプライベートメンバーにアクセスできるようになりました。派生クラスは、その基底クラスのプライベートメンバーにアクセスすることができます

class A 
{ 
    template<typename T> 
    struct a { using type = a; }; 
}; 

class B : A 
{ 
    template<typename T> 
    using type = typename a<T>::type; 
}; 

int main(){ } 

コンパイル結果:

にMinGW64/mingwの-W64-x86_64の-打ち鳴らす(MSYS2から)3.9.1-3

$ clang++ -Wall test.cpp -o test.exe -std=c++14 


この例を検討します

mingw64/mingw-w64-x86_64-gcc 6.3.0-2(MSYS2より)

$ g++ -Wall test.cpp -o test.exe -std=c++14 

どちらのコンパイラはエラーなしで受け入れます!

class A 
{ 
    template<typename T> 
    struct a { using type = a; }; 
}; 

class B : A 
{ 
    template<typename T> 
    struct b { using type = typename a<T>::type; }; 
}; 

int main(){ } 

COMPILATION

にMinGW64/mingw-結果:また、あなたは、単にB::b::type打ち鳴らすようなものにB::typeを移動した場合は、急に問題なくコンパイル++ gは一方で、それは、プライベートメンバにアクセスすべきではない認識します(MSYS2から)W64-x86_64の-打ち鳴らす3.9.1-3

$ clang++ -Wall test.cpp -o test.exe -std=c++14 
test.cpp:10:39: error: 'a' is a private member of 'A' 
     struct b { using type = typename a<T>::type; }; 
             ^
test.cpp:4:13: note: implicitly declared private here 
     struct a { using type = a; }; 
      ^
1 error generated. 

にMinGW64/mingwの-W64-x86_64の-GCC(MSYS2から)6.3.0-2

$ g++ -Wall test.cpp -o test.exe -std=c++14 

私の質問は、派生クラスが時々その基底クラスのメンバーにアクセスすることができ、そして時々ない、この予想される動作で、この動作を引き起こしているものを、ありますか?

答えて

9

私の質問は、派生クラスが時々その基底クラスのメンバーにアクセスすることができ、そして時々ないこの動作を引き起こしているものであり、この予想される動作ですか?

コンパイラのバグです。テンプレートのアクセス制御に関連するgcc bugsの束がありますが、これは具体的には#41437のアドレスです。 clangエイリアステンプレートのバグは#15914です。

関連する問題