Đó là điều không thể. Tiêu chuẩn cũng có một lưu ý về vấn đề này tại 14.8.1/7
[Lưu ý: vì rõ ràng danh sách mẫu tranh luận sau chức năng tên mẫu, và bởi vì các mẫu hàm thành viên chuyển đổi và hàm thành viên xây dựng các mẫu được gọi mà không sử dụng một tên hàm, không có cách nào để cung cấp danh sách đối số mẫu rõ ràng cho các mẫu chức năng này. ]
Nếu bạn có thể sống với nó, bạn có thể làm việc xung quanh nó
struct T {
template<class U> T(identity<U>);
};
struct U {
U() : t(identity<void>()) {}
T t;
};
Với identity
như nó được định nghĩa trong thúc đẩy
template<typename T> struct identity { typedef T type; };
Nguồn
2010-05-07 07:38:01
cảm ơn you.no vấn đề gì, tôi có thể làm việc xung quanh này – Anycorn
@ litb: Bạn có biết nếu có bất kỳ lý do gì họ chỉ đơn giản là không cho phép bạn gọi T :: T() một cách rõ ràng? –
@JosephGarvin tôi nghi ngờ vì 'T()' hoạt động bằng cách có điều trước khi dấu ngoặc đơn là một kiểu, 'Type()' xây dựng một đối tượng tạm thời. Đây không phải là wih 'T :: T()' ở đâu trước khi các parens là một hàm. Ý nghĩa của điều đó là gọi hàm được đặt tên. Nhưng trực tiếp gọi một nhà xây dựng không có ý nghĩa, nó sẽ ít nhất yêu cầu từ ngữ bổ sung để làm cho nó hoạt động và làm điều mong đợi. –