2008-08-30 31 views
22

C++ có vẻ khá grouchy khi tuyên bố mẫu trên nhiều tệp. Cụ thể hơn, khi làm việc với các lớp templated, trình liên kết mong đợi tất cả các định nghĩa phương thức cho lớp trong một tệp đối tượng trình biên dịch đơn. Khi bạn đưa vào tiêu đề tài khoản, các tuyên bố khác, thừa kế, v.v., mọi thứ trở nên lộn xộn.Mẫu trải rộng trên nhiều tệp

Có lời khuyên chung hoặc cách giải quyết nào để tổ chức hoặc phân phối lại định nghĩa thành viên được tạo khuôn mẫu trên nhiều tệp không?

Trả lời

23

Có lời khuyên chung hoặc cách giải quyết để tổ chức hoặc phân phối lại định nghĩa thành viên templated trên nhiều tập tin?

Có; không.

Thông số C++ cho phép trình biên dịch có thể "xem" toàn bộ mẫu (tuyên bố và định nghĩa) tại thời điểm khởi tạo và (do sự phức tạp của bất kỳ triển khai nào) hầu hết các trình biên dịch đều giữ yêu cầu này. Kết quả là #inclusion của bất kỳ tiêu đề mẫu nào cũng phải #include bất kỳ và tất cả nguồn cần thiết để tạo mẫu.

Cách dễ nhất để giải quyết vấn đề này là đổ tất cả mọi thứ vào tiêu đề, nội tuyến nơi có thể đặt, ngoài lề khi cần thiết.

Nếu bạn thực sự coi đây là một vấn đề không thể chấp nhận được, một tùy chọn chung là chia mẫu thành cặp tiêu đề/triển khai thông thường, sau đó #bao gồm tệp triển khai ở cuối tiêu đề.

Tính năng "xuất" của C++ có thể hoặc không thể cung cấp cách giải quyết khác. Tính năng này được hỗ trợ kém và được xác định kém; mặc dù nó về nguyên tắc nên cho phép một số loại biên dịch riêng biệt của các mẫu, nó không nhất thiết phải obviate nhu cầu mà trình biên dịch có thể nhìn thấy toàn bộ cơ thể mẫu.

5

Trên bao nhiêu tệp? Nếu bạn chỉ muốn tách các định nghĩa lớp khỏi triển khai, hãy thử this article trong các câu hỏi C++. Đó là cách duy nhất tôi biết về nó hoạt động vào lúc này, nhưng một số IDE (ví dụ Eclipse CDT) sẽ không liên kết phương thức này đúng cách và bạn có thể gặp nhiều lỗi. Tuy nhiên viết makefiles của riêng bạn hoặc bằng cách sử dụng Visual C++ này đã luôn luôn làm việc cho tôi :-)

+0

+1 cho liên kết để liên kết bài viết –

+2

bài báo là lỗi thời! – iamantony

3

Khi/nếu trình biên dịch của bạn hỗ trợ C++ 0x, từ khóa extern có thể được sử dụng để tách các khai báo mẫu khỏi các định nghĩa.

Xem here để có giải thích ngắn gọn.

Ngoài ra, phần 6.3, "The Tách Model," của C++ Templates: The Guide Complete David Vandevoorde và Nicolai M. Josuttis mô tả tùy chọn khác.

alt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpg

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