2014-12-13 2 views
2

я назвал шаблон в моем C++ программа:Должен ли я отделить файлы cpp и h на C++?

const matrix::CMatrix<double> M1(3,3,{{5.0,0.0,2.0},{1.0,1.0,3.0},{6.0,7.0,7.0}}); 

я получил такую ​​ошибку компоновщика:

tests.h:15: undefined reference to `matrix::CMatrix<double>::CMatrix(int, int, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >)' 

после массивного поиска, в конце концов я понял, что это происходит потому, что я отделил мой час и CPP файлы и template не терпит этого. В C предлагается отделить файлы c и h и использовать Makefile. Но в соответствии с такими проблемами в C++ все же предлагается отделить файлы cpp и h? Это не чистый способ реализовать некоторые шаблоны в h-файлах и некоторые другие функции в файле cpp. что мне делать?

редактировать:

matrix.h

template<typename T> 
class CMatrix 
{ 
..... 

matrix.cpp

implementation of CMatrix 

main.cpp

defining M1 
+0

Что значит «разделенный»? Где объявлен ваш шаблон (в .cpp или в .h) и где он используется? – Ashalynd

ответ

1

Да, вы должны отделить CPP от .h файлов.
Это не просто предложение.

Файлы .cpp скомпилированы в единицы компиляции, что означает, что каждый .cpp-файл скомпилирован в файл .obj со всем кодом, который у него есть, и весь код, который он содержит.

Так что если у вас есть код в файле .h, который включен во многие .cpp-файлы, он скомпилируется много раз.

Теперь этот факт может стать уродливым, когда у вас есть несколько проектов и библиотек.

Во всяком случае, шаблоны - это другая проблема.
Шаблоны calsses на самом деле не скомпилированы до тех пор, пока они не будут созданы (пока вы их не используете).
Затем компилятор создает необходимый код для правильного типа.
Это не просто компилируются в первый раз compliler видит шаблонный код (например, «обычного» кода)

Итак, вам нужно иметь этот шаблонный код в файле заголовка, так что компилятор «видит» его в каждый файл компиляции (.cpp), который его использует.
Таким образом, компилятор может создать правильный код там, где это необходимо.

1

Если вы хотите используйте свои шаблоны для нескольких файлов, поместите шаблон в файл заголовка, чтобы вы могли включить его в другое место. Если вам нужен только шаблон внутри файла, тогда поставьте его в cpp.

0

Если шаблонные методы являются частными, вы можете и должны поместить определения (тела метода) в файл .cpp. Они должны быть только в файле .hpp, если они являются общедоступными.

Существует проблема размещения всех в заголовках: если вы рисуете дерево зависимостей всех ваших файлов, с main.cpp в качестве корневого узла, то оно работает только в том случае, если нет зависимостей, указывающих вверх.Разумеется, это будет отличный и простой дизайн, но на практике вам часто нужны некоторые обратные ссылки (может быть что угодно, например, метод, принимающий определенный класс в качестве аргумента или имеющий определенный класс в качестве члена). В этот момент вы можете получить множество ошибок компилятора «неполного класса» ...

Смежные вопросы