Шаблон C++ и включает охранников
Я относительно новичок в C++, поэтому мой вопрос может быть простым; однако я не могу понять, почему мой код не работает, когда я думал, что должен. Пример кода выглядит следующим образом.
//a.h
#ifndef A
#define A
template<class T>
class a{
public:
a();
private:
T str;
};
#include "a.cpp"
#endif
//a.cpp
//#ifdef A
#include "a.h"
using namespace std;
template<class T>
a<T>::a(){
str = 'a';
}
//#endif
//driver.cpp
#include"a.h"
#include <string>
using namespace std;
void main(){
a<string> object;
}
Я читал информацию в Интернете о том, как избежать ошибок при включении шаблона. Одним из них является то, что я пытаюсь достичь здесь: #include "a.cpp"
в a.h
, Тем не менее, образцы, на которые я смотрел, все еще используют #include "a.h"
в a.cpp
, показано в примере кода. Тем не менее, я получаю function template has already been defined
ошибка. Я обнаружил, что с помощью #ifdef A
и комментируя #include "a.h"
в a.cpp поможет мне избавиться от этой ошибки переопределения. Но я хочу понять, что происходит. Разве переопределение не должно быть уже выполнено включенным охранником в a.h
?
2 ответа
Краткий ответ: если реализация находится не в том же заголовке, что и объявление, она не будет доступна, когда компилятор попытается создать экземпляр шаблона.
Это не способ отделить реализацию шаблона от объявления шаблона. Вы не включаете файл.cpp в файл.h. Вместо этого вы просто добавляете файл.cpp в файл проекта или создаете файл, чтобы он компилировался, как и все остальные. Затем вы используете явное создание шаблона, чтобы избежать ошибок компоновки.