2010-05-18 41 views
26

Một hàm tạo của một lớp có thể là một hàm mẫu. Tại thời điểm mà một hàm dựng được gọi, trình biên dịch thường xem xét các đối số được đưa ra cho hàm tạo và xác định các tham số mẫu được sử dụng từ chúng. Có một số cú pháp để xác định các tham số mẫu một cách rõ ràng không?Các tham số mẫu của một hàm tạo có được xác định rõ ràng không?

Một ví dụ giả tạo:

struct A { 
    template<typename T> 
    A() {} 
}; 

Có cách nào để nhanh chóng lớp này? Cú pháp để xác định rõ ràng các tham số mẫu của hàm tạo là gì?

Trường hợp sử dụng của tôi sẽ là một vấn đề mà trình biên dịch dường như không tìm được hàm tạo khuôn mẫu đúng. Xác định rõ ràng các tham số mẫu có thể sẽ tạo ra các thông báo lỗi hữu ích hơn hoặc thậm chí giải quyết được vấn đề.

+1

Xác định rõ ràng các đối số mẫu cho các hàm tạo chỉ hoạt động trong các chuyên môn rõ ràng, các phiên âm, định nghĩa ngoài dòng và khai báo người bạn của hàm tạo. –

+0

'mẫu struct A { mẫu A() {} };' - hoạt động tốt cho tôi. Nhưng tất nhiên bây giờ chúng ta có lớp mẫu. – bruziuz

Trả lời

32

số Tiêu chuẩn C++ 03 nói:

[Lưu ý: vì rõ ràng danh sách mẫu tranh luận sau chức năng tên mẫu, và vì chức năng thành viên chuyển đổi các mẫu và hàm thành viên xây dựng các mẫu được gọi là không bằng cách sử dụng 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.] (§14.5.2/5)

3

không, bạn không thể khởi tạo lớp đó bằng cách sử dụng hàm tạo đó. NHƯNG:



struct A 
{ 
    template < typename T > 
    A(T const&); 
}; 

Bây giờ bạn có thể.

+3

Tôi không hiểu câu trả lời ... làm thế nào nó liên quan đến câu hỏi? –

+2

Nó cho thấy cách bạn có thể làm điều đó. Nó chỉ xảy ra như vậy mà bạn không thể làm điều đó theo cách câu hỏi được hỏi. – MSN

+0

Nhận xét quá xấu không thể bị giảm hạng. Đó là một từ xa "tuyệt vời". –

8

Có một giải pháp khác để chuyển thông tin kiểu tới các nhà xây dựng có khuôn mẫu có thể ' t lấy một giá trị của loại này như là một argume nt:

template<class T> 
struct id 
{}; 

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

A a=id<int>(); 

Edit:

Xin lưu ý: A a(id<int>()); sẽ không làm việc, vì phân tích cú pháp gây nhiều tranh cãi nhất. Nó sẽ được hiểu là một khai báo hàm. Xem this question để được giải thích thêm.

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