2013-03-22 39 views
6

Tôi đang cố gắng viết một lớp mẫu có thể tạo thành các lớp tùy thuộc vào số <class> Tôi vượt qua. Vấn đề là tôi không thể khai báo và xác định trong cùng một tệp .h. Trong dự án của tôi, công cụ UTF chỉ có thể hoạt động với các tệp .cpp (đối với phạm vi mã, v.v.). Tôi đã thấy trong một blog rằng họ nói “Thêm .cpp thay vì .h”. Điều này có được khuyến khích không?Các tệp .h và .cpp riêng biệt trong triển khai lớp mẫu

Template.h

#ifndef TEMPLATE_H_ 
#define TEMPLATE_H_ 

template<class T> 
class Template 
{ 
public: 
    T Add(T a,T b); 
}; 

#endif /* TEMPLATE_H_ */ 

Template.cpp

#include "Template.h" 

template<class T> 
T Template<T>::Add(T a, T b) 
{ 
    return a+b; 
} 

Main.cpp

#include "Template.cpp" //Is this a good practise? 
#include <iostream> 

int main(int argc, char **argv) { 
    Template<int> obj; 
    std::cout<<obj.Add(3,4)<<std::endl; 
} 

Nếu đây là không nên sau đó làm thế nào để giải quyết vấn đề này? export?

Trả lời

4

Mẫu phải được xác định trong mọi đơn vị dịch mà chúng được sử dụng. Điều này có nghĩa là chúng phải được xác định trong các tệp tiêu đề. Nếu công cụ của bạn khẳng định trên tiện ích mở rộng .cpp, bạn cũng có thể cung cấp công cụ này, giống như bạn đã làm.

Bạn thậm chí không cần chia tiêu đề giả thành .h.cpp trong trường hợp này. Bạn chỉ có thể đặt tất cả trong số .cpp#include đó.

+0

Điều này không đúng. Mặc dù nó là thuận tiện nhất để đưa định nghĩa vào mọi đơn vị dịch thuật, và do đó thực hành phổ biến, nó không phải là một yêu cầu. –

+0

@MarkRansom Yup, bạn nói đúng. Tuy nhiên, rất hiếm khi có thể thực hiện tất cả các cảnh báo rõ ràng bắt buộc "trước". – Angew

7

biên dịch cần phải có quyền truy cập đến việc thực hiện các phương pháp để nhanh chóng các lớp mẫu, do đó việc thực hành phổ biến nhất là một trong hai để bao gồm các định nghĩa của một mẫu trong file header khai báo mẫu mà hoặc để xác định chúng trong các tệp tiêu đề.

Xem Why can templates only be implemented in the header file?

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