Поэтому у меня возникла проблема с частичной специализацией шаблонов функций. Я выбираю решение, описанное здесь: Вопрос
Теперь у меня есть это:
#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 ++.
Эти классы шаблонов не могут быть разделены на отдельные объектные файлы и остаются полностью специализированными. Если вы посмотрите на стандартные шаблоны, такие как vector
по этой причине вы увидите, что все находится в одном заголовочном файле.
Если вы хотите скрыть реализацию ваших шаблонов таким образом, вы должны принудительно создать экземпляр одного или нескольких конкретных типов. Вы можете сделать это, прикрепив что-то вроде
template class helper<std::vector<int>>;
в конце vector_helper.cpp
если я правильно помню. Но лучше всего хранить все ваши шаблоны в заголовках.
Других решений пока нет …