Шаблон 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 в файл проекта или создаете файл, чтобы он компилировался, как и все остальные. Затем вы используете явное создание шаблона, чтобы избежать ошибок компоновки.

Другие вопросы по тегам