2010-05-07 47 views
34

Bạn có thể cho tôi biết cách gọi hàm tạo mẫu một cách rõ ràng (trong danh sách trình khởi tạo) không? ví dụ:C++ gọi hàm tạo mẫu rõ ràng

struct T { 
    template<class> T(); 
}; 

struct U { 
    U() : t<void>() {} //does not work 
    T t; 
}; 

nhờ

Trả lời

35

Đó 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; }; 
+0

cảm ơn you.no vấn đề gì, tôi có thể làm việc xung quanh này – Anycorn

+13

@ 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? –

+0

@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. –

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