奇妙な状況に遭遇しました。そこでは、派生したクラスが、テンプレートが関与する基本クラスのプライベートメンバーにアクセスできるようになりました。派生クラスは、その基底クラスのプライベートメンバーにアクセスすることができます
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
私の質問は、派生クラスが時々その基底クラスのメンバーにアクセスすることができ、そして時々ない、この予想される動作で、この動作を引き起こしているものを、ありますか?