lightalex
@lightalex

Почему при использовании шаблонов классов выдает ошибку «неразрешенный внешний символ»?

Доброго времени суток!
Пытаюсь использовать шаблонный класс:
TemplateClass.h
#pragma once
#include <iostream>
#include <boost/asio/ip/tcp.hpp>

template <class T>
class TemplateClass {
public:
	TemplateClass();
	~TemplateClass();
};
TemplateClass.cpp
#include "pch.h"
#include "TemplateClass.h"


template <class T>
TemplateClass<T>::TemplateClass() { }

template <class T>
TemplateClass<T>::~TemplateClass() { }
main.cpp
#include "pch.h"
#include <iostream>
#include "TemplateClass.h"

int main() {
	TemplateClass<boost::asio::ip::tcp::socket>* test = new TemplateClass<boost::asio::ip::tcp::socket>();
}

Выдает ошибку при компиляции:
Скриншот
5c2b60623e15e039085655.png
Текстовый вариант
  • Серьезность Код Описание Проект Файл Строка Состояние подавления
    Ошибка (активно) E2512 Аргумент для тестирования функции макро должен быть простым идентификатором. TemplateClassErrorTest D:\cpp\libraries\boost_1_68_0\boost\system\error_code.hpp 401

  • Серьезность Код Описание Проект Файл Строка Состояние подавления
    Ошибка LNK2001 неразрешенный внешний символ ""public: __cdecl TemplateClass >::TemplateClass >(void)" (??0?$TemplateClass@V?$basic_stream_socket@Vtcp@ip@asio@boost@@@asio@boost@@@@QEAA@XZ)" TemplateClassErrorTest D:\cpp\Tests\TemplateClassErrorTest\TemplateClassErrorTest\TemplateClassErrorTest.obj 1

  • Серьезность Код Описание Проект Файл Строка Состояние подавления
    Ошибка LNK1120 неразрешенных внешних элементов: 1 TemplateClassErrorTest D:\cpp\Tests\TemplateClassErrorTest\x64\Release\TemplateClassErrorTest.exe 1


Если перенести содержимое файла TemplateClass.cpp в файл TemplateClass.h, то все компилируется, все работает.
Подскажите, что не так?
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Потому что шаблоны должны быть объявлены и определены в заголовочном файле (по стандарту языка). Перенесите всё из cpp в h и у вас всё заработает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы