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] và [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);
}
Trong GCC đó là một lỗi, trong đó nó nghĩ rằng bạn tuyên bố một chức năng. –
@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 ... –
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