Tôi đã gặp phải một tình huống lạ khi lớp dẫn xuất của tôi có thể truy cập một thành viên riêng của lớp cơ sở của nó, nơi các khuôn mẫu có liên quan.Lớp có nguồn gốc có thể truy cập vào thành viên riêng của lớp cơ sở
Hãy xem xét ví dụ sau:
class A
{
template<typename T>
struct a { using type = a; };
};
class B : A
{
template<typename T>
using type = typename a<T>::type;
};
int main(){ }
KẾT QUẢ LẬP:
mingw64/mingw-w64-x86_64-vang 3.9.1-3 (từ MSYS2)
$ clang++ -Wall test.cpp -o test.exe -std=c++14
mingw64/mingw-w64-x86_64-gcc 6.3.0-2 (từ MSYS2)
$ g++ -Wall test.cpp -o test.exe -std=c++14
Cả hai trình biên dịch đều chấp nhận không có lỗi! Ngoài ra, nếu bạn chỉ cần di chuyển B::type
vào một cái gì đó giống như B::b::type
kêu vang đột nhiên nhận ra nó không nên truy cập vào một thành viên tư nhân, trong khi g ++ biên dịch mà không có một vấn đề:
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(){ }
KẾT QUẢ LẬP
mingw64/mingw- w64-x86_64-vang 3.9.1-3 (từ MSYS2)
$ 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 6.3.0-2 (từ MSYS2)
$ g++ -Wall test.cpp -o test.exe -std=c++14
Câu hỏi của tôi là, những gì đang gây ra hành vi này mà một lớp học có nguồn gốc đôi khi có quyền truy cập vào lớp cơ sở của nó thành viên, và đôi khi không, và là hành vi mong đợi này?