Câu hỏi tiếp theo tới this one.Tại sao trình biên dịch chọn hàm tạo lớp cơ sở bên trong danh sách đối số mẫu?
Về cơ bản, trong đoạn mã sau, tại sao các trình biên dịch nghĩ rằng B
bên A<B>
trong constructor C
s tham khảo (không truy cập được) constructor của lớp B
cơ sở?
struct B{};
template <typename T>
struct A : private T{};
struct C : public A<B>{
C(A<B>); // ERROR HERE
};
Live example on Ideone. Output:
prog.cpp:1:9: error: 'struct B B::B' is inaccessible
prog.cpp:7:7: error: within this context
Lưu ý rằng các lỗi tương tự bật lên nếu bạn thay đổi đối số nhà xây dựng để A<B*>
, A<B&>
hoặc thậm chí A<const B>
. Cũng lưu ý rằng ba của MSVC10, GCC 4.7 và Clang 3.1 ToT sẽ lỗi, vì vậy nó phải là một cái gì đó trong spec C++. Nó là gì?
Tôi không biết tại sao bạn tạo chủ đề chính xác tương tự! Bạn có thể đã chỉnh sửa chủ đề đó để làm chủ đề đó tốt hơn. – Nawaz
@Nawaz: Về cơ bản nó là một câu hỏi khác. Tôi hỏi "tại sao", câu hỏi khác hỏi "phải làm gì". – Xeo
Người đàn ông, tôi đã bị cắn bởi điều này nhiều hơn một lần với 'class A: private NotCopyable {class B: private NotCopyable {}}; '. Tôi đoán nó trông lên các biểu tượng trong phạm vi lớp trước khi nhìn vào phạm vi toàn cầu. –