Неопределенная ссылка на частичную специализированную функцию класса шаблона во время ссылки

Поэтому у меня возникла проблема с частичной специализацией шаблонов функций. Я выбираю решение, описанное здесь: Вопрос

Теперь у меня есть это:

#include <vector>
#include <iostream>

template <typename T> struct helper {
static void print(T value) { std::cout << value; }
};
template <typename T> struct helper<std::vector<T>> {
static void print(std::vector<T> const &value) { }
};

template <typename T>
void print (T const &value) {
// Just delegate.
helper<T>::print (value);
}int main () {
print (5);
std::vector<int> v;
print (v);
}

Но я хочу иметь этот макет:

helper.hpp

#include <vector>
#include <iostream>

template <typename T> struct helper {
static void print(T value) { std::cout << value; }
};

vector_helper.cpp

#include <vector>
#include <iostream>

template <typename T> struct helper<std::vector<T>> {
static void print(std::vector<T> const &value) { }
};

print.hpp

#include "helper.hpp"
template <typename T>
void print (T const &value) {
// Just delegate.
helper<T>::print (value);
}

main.cpp

#include "print.hpp"
int main () {
print (5);
std::vector<int> v;
print (v);
}

Скомпилировано так:

g++ main.cpp vector_helper.cpp

Проблема в том, что MinGW выдает ошибки времени компоновки: неопределенная ссылка на helper<vector<...>>::print(vector<...>)

Когда я добавляю строку:

#include "vector_helper.cpp"

до int main() {...}, он прекрасно компилируется и тоже работает. Как я могу решить это, потому что я хочу добавить специализацию класса в файл, связанный командой g ++.

0

Решение

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

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

template class helper<std::vector<int>>;

в конце vector_helper.cppесли я правильно помню. Но лучше всего хранить все ваши шаблоны в заголовках.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]