2017-03-16 20 views
7

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?

Trả lời

9

Câu hỏi của tôi là, điều gì gây ra hành vi này khi một lớp dẫn xuất đôi khi có quyền truy cập vào các thành viên của lớp cơ sở, và đôi khi không, và hành vi được mong đợi này?

Lỗi trình biên dịch. Có một bó của gcc bugs liên quan đến kiểm soát truy cập trong các mẫu, điều này có thể là địa chỉ cụ thể bởi #41437. Lỗi mẫu bí danh kêu vang là #15914.

Các vấn đề liên quan