2016-12-24 34 views
11

từ temp.local:ẩn của mẫu tham số của thành viên mẫu

Trong định nghĩa của một thành viên của một lớp mẫu xuất hiện bên ngoài của lớp mẫu định nghĩa, tên của một thành viên của lớp mẫu da tên của tham số mẫu của bất kỳ lớp nào kèm theo mẫu (nhưng không phải là thông số mẫu của thành viên nếu thành viên là một lớp hoặc mẫu chức năng). [Ví dụ:

template<class T> struct A { 
    struct B { /* ... */ }; 
    typedef void C; 
    void f(); 
    template<class U> void g(U); 
}; 

template<class B> void A<B>::f() { 
    B b;    // A's B, not the template parameter 
} 

template<class B> template<class C> void A<B>::g(C) { 
    B b;    // A's B, not the template parameter 
    C c;    // the template parameter C, not A's C 
} 

- end dụ]

vấn đề là, mỗi trình biên dịch, mà tôi đã cố gắng (g ++, vc, icc, kêu vang), đối xử với C trong A<B>::g(C) như thành viên của một và không biên dịch ví dụ đó.

Đây có phải là lỗi phổ biến không?

+2

Vâng, cho rằng "mỗi trình biên dịch" mà bạn đã thử làm điều đó, tôi không thể nghĩ ra bất kỳ định nghĩa nào tốt hơn về "phổ biến". Đó là một lý lẽ khá thuyết phục để mô tả đây là lỗi trình biên dịch "phổ biến". –

+0

i có nghĩa là "phổ biến đối với tất cả các trình biên dịch, mà tôi đã thử". –

+0

Không có nhiều trình biên dịch C++ xung quanh. Có vẻ như bạn đã đặt tên cho họ rất nhiều. Họ không chính xác phát triển trên cây, bạn biết ... Đó là an toàn để bỏ qua trình biên dịch lịch sử ... –

Trả lời

0

Trong khi liên kết bạn cho là bản nháp và tuyên bố rõ ràng nó không phải là một phần của bất kỳ tiêu chuẩn nào (http://eel.is/c++draft/), điều khoản cụ thể này trong dự thảo có vẻ giống với ISO C++ 14.6.1, đoạn 7.

Vì vậy, nó thực sự dường như là một lỗi trình biên dịch phổ biến hoặc một mệnh đề xung đột và bị mất các điều khoản khác. Tôi đã xác minh ví dụ không biên dịch trên MacOS Clang v802.0.42). Vì bạn nói tất cả các trình biên dịch chính phát ra các lỗi ở đây, tôi nghi ngờ điều khoản này không hợp lý để thực hiện do xung đột với một số mệnh đề khác.

EDIT: Tôi cũng tìm thấy một cuộc thảo luận trong cộng đồng tiêu chuẩn here liên quan đến chủ đề này. Độ sâu mà nó được thảo luận here gợi ý với tôi rằng quy tắc này là gây tranh cãi và thậm chí có thể thay đổi.

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