2011-09-14 52 views
12

Tôi có một lớp:chức năng template tin

Ch

class C { 
private: 
    template<int i> 
    void Func(); 

    // a lot of other functions 
}; 

C.cpp

// a lot of other functions 

template<int i> 
void C::Func() { 
// the implementation 
} 

// a lot of other functions 

tôi biết, rằng nó không phải là ý tưởng tốt nhất để di chuyển mẫu thực hiện trong tập tin cpp (bởi vì nó sẽ không được nhìn thấy từ các cpp khác, có thể bao gồm tiêu đề có khai báo mẫu).

Nhưng còn các chức năng riêng thì sao? Bất cứ ai có thể cho tôi biết nếu có khuyết điểm của việc thực hiện các chức năng mẫu tư nhân trong một tập tin .cpp?

+0

http://stackoverflow.com/questions/4315969/where-to-define-c-class-member-template-function-and-functors-that-instantiate/4316020#4316020 –

+1

Trong khi câu hỏi là về mặt kỹ thuật được trả lời bởi Als và Nicola, đối với tôi điều này chỉ đặt ra câu hỏi tại sao bạn làm cho mẫu này thành viên. Nó sẽ không được tốt hơn nhiều để có điều này như là một mẫu chức năng miễn phí trong (không gian tên không tên của) các tập tin cpp? Tôi đã thấy rằng, theo thời gian, tôi đã sử dụng các hàm thành viên riêng tư ngày càng ít, càng ngày càng sử dụng các hàm miễn phí trong (không gian tên không tên) của tệp triển khai lớp. – sbi

Trả lời

10

Khi mẫu chức năng được sử dụng theo cách kích hoạt sự khởi tạo của nó, trình biên dịch (tại một số điểm) cần xem định nghĩa của mẫu đó. Và đó là lý do, các mẫu thường được triển khai bên trong một tệp tiêu đề bằng cách sử dụng finctions nội tuyến.

Vì vậy, miễn là các quy tắc ở trên được theo dõi thì vẫn có giao diện và triển khai được tách riêng trong tệp tiêu đề và nguồn.


tham khảo:
C++ 03 tiêu chuẩn, § 14.7.2.4:

Định nghĩa của một mẫu chức năng phi xuất khẩu, một hàm phi xuất khẩu thành viên mẫu, hoặc một thành viên không xuất khẩu chức năng hoặc thành viên dữ liệu tĩnh của một mẫu lớp phải có mặt trong mọi đơn vị dịch, trong đó nó được khởi tạo rõ ràng.

+0

Điều này không mâu thuẫn: 'Vì vậy, miễn là các quy tắc trên được tiếp tục thì vẫn có giao diện và thực hiện được tách biệt trong tiêu đề và tệp nguồn' .. ** mâu thuẫn ** >>' Và đó là lý do, các mẫu là thường được thực hiện bên trong một tập tin tiêu đề bằng cách sử dụng nội tuyến finctions.', hoặc tôi đã bỏ lỡ một cái gì đó? – Nawaz

+0

@Nawaz: Đã cập nhật để trả lời Câu hỏi của bạn. Hth. –

+0

Điều đó không trả lời được câu hỏi của tôi. Bạn đã nói, định nghĩa có thể nằm trong tệp .cpp, như thế nào? – Nawaz

6

Trừ khi mẫu chức năng thành viên riêng của bạn được sử dụng bởi các hàm thành viên được xác định nội tuyến trong định nghĩa lớp, tôi thấy không có gì sai với phương pháp này. Ngược lại, tôi nghĩ rằng ít phụ thuộc hơn vào các tập tin tiêu đề của bạn, thì tốt hơn.

Điều này sẽ hoạt động miễn là bạn thực thi quy ước luôn luôn cung cấp việc triển khai từng lớp trong một tệp nguồn duy nhất.

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