странная ошибка компоновщика при использовании шаблонов с std :: unique_ptr

Возможный дубликат:
Почему шаблоны могут быть реализованы только в заголовочном файле?

Я пытался понять это в течение 2 дней.

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

main.cpp:17: undefined reference to `std::unique_ptr<Foo, std::default_delete<Foo> > Bar::make_unique_pointer<Foo>()'

Код ниже демонстрирует проблему, с которой я столкнулся.

bar.h

class Bar {
public:
template <class T>
std::unique_ptr<T> make_unique_pointer();
};

Bar.cpp

#include "Bar.h"
template <class T>
std::unique_ptr<T> Bar::make_unique_pointer() {
return std::unique_ptr<T>(new T());
}

main.cpp

#include "Bar.h"
struct Foo {};

int main() {
Bar bar;
auto p = bar.make_unique_pointer<Foo>();
return 0;
}

Однако, если я определяю функцию в строке, она работает

class Bar {
public:
template <class T>
std::unique_ptr<T> make_unique_pointer() {
return std::unique_ptr<T>(new T());
}
};

Или если я положу определение в main.cpp или даже в Bar.h это будет хорошо скомпилировано.

Я получаю ошибку компоновщика, только когда они находятся в отдельных файлах: /

1

Решение

Шаблоны функций должны быть реализованы в том же файле, в котором они созданы. Смотрите этот ответ, почему.

2

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector