2017-09-07 43 views
15

Theo [temp.deduct.guide/3]:Cách cung cấp hướng dẫn khấu trừ cho lớp mẫu lồng nhau?

(...) Một trích-dẫn được khai báo trong phạm vi tương tự như lớp mẫu tương ứng và, đối với một lớp mẫu thành viên, với cùng truy cập. (...)

Nhưng ví dụ bên dưới dường như không biên dịch cả trong số [gcc][clang].

#include <string> 

template <class> 
struct Foo { 
    template <class T> 
    struct Bar { 
     Bar(T) { } 
    }; 
    Bar(char const*) -> Bar<std::string>; 
}; 

int main() { 
    Foo<int>::Bar bar("abc"); 
    static_cast<void>(bar); 
} 

Cú pháp chính xác của hướng dẫn khấu trừ cho lớp mẫu lồng nhau là gì? Hoặc có lẽ điều này là chính xác nhưng nó chưa được hỗ trợ bởi các trình biên dịch?


cú pháp tương tự nhưng không có lớp lồng nhau biên dịch tốt cả trong gcc và kêu vang:

#include <string> 

template <class T> 
struct Bar { 
    Bar(T) { } 
}; 
Bar(char const*) -> Bar<std::string>; 

int main() { 
    Bar bar("abc"); 
    static_cast<void>(bar); 
} 
+0

Trong GCC đó là một lỗi, trong đó nó nghĩ rằng bạn tuyên bố một chức năng. –

+0

@Someprogrammerdude Tôi không chắc chắn nếu nó là một cú pháp chính xác mặc dù - không có ví dụ tương ứng trong tiêu chuẩn nhưng nó đề cập đến tình hình ... –

+0

Hướng dẫn khấu trừ mẫu lồng nhau hoạt động nếu lớp cha không được tạo mẫu .... – AndyG

Trả lời

11

[temp.deduct.guide] bao gồm các câu:

Một trích-dẫn sẽ được công bố trong cùng một phạm vi làm mẫu lớp tương ứng và, đối với mẫu lớp thành viên, có cùng quyền truy cập.

Điều này cho thấy ví dụ của bạn nên làm việc - hướng dẫn khấu trừ được hỗ trợ một cách rõ ràng cho các lớp mẫu thành viên, miễn là chúng được khai báo trong phạm vi tương tự và truy cập (đó sẽ là phạm vi lớp và public - kiểm tra và kiểm tra).

Đây là gcc bug 79501 (do Richard Smith đệ trình).

+0

Ví dụ được đệ trình bởi Richard có vẻ như biên dịch trong tiếng lóng mặc dù ... –

+2

@WF Lớp bên ngoài của bạn là một mẫu lớp, ví dụ trong lỗi này đơn giản hơn. Nên gửi một lỗi llvm. – Barry

+0

Yep điều này chắc chắn gợi ý rằng cú pháp phải chính xác. Tôi sẽ cố gắng để gửi một lỗi sau đó ... –

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