Задать вопрос
Dyikot
@Dyikot

Почему вылазит link error(не видит вирутальные методы?)?

1>Menu.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl Queue::Pop(void)" (?Pop@?$Queue@UProcessor@@@@UEAAXXZ)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual void __cdecl Queue::Resize(int)" (?Resize@?$Queue@UProcessor@@@@EEAAXH@Z)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual void __cdecl Queue::Add(struct Processor const &,unsigned int)" (?Add@?$Queue@UProcessor@@@@EEAAXAEBUProcessor@@I@Z)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual void __cdecl Queue::Remove(void)" (?Remove@?$Queue@UProcessor@@@@EEAAXXZ)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual struct Processor const & __cdecl Queue::Show(bool)" (?Show@?$Queue@UProcessor@@@@EEAAAEBUProcessor@@_N@Z)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual bool __cdecl Queue::IsContainerEmpty(void)const " (?IsContainerEmpty@?$Queue@UProcessor@@@@EEBA_NXZ)
1>Menu.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl PriorityQueue::Pop(void)" (?Pop@?$PriorityQueue@UProcessor@@@@UEAAXXZ)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual void __cdecl PriorityQueue::Resize(int)" (?Resize@?$PriorityQueue@UProcessor@@@@EEAAXH@Z)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual void __cdecl PriorityQueue::Add(struct Processor const &,unsigned int)" (?Add@?$PriorityQueue@UProcessor@@@@EEAAXAEBUProcessor@@I@Z)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual void __cdecl PriorityQueue::Remove(void)" (?Remove@?$PriorityQueue@UProcessor@@@@EEAAXXZ)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual struct Processor const & __cdecl PriorityQueue::Show(bool)" (?Show@?$PriorityQueue@UProcessor@@@@EEAAAEBUProcessor@@_N@Z)
1>Menu.obj : error LNK2001: unresolved external symbol "private: virtual bool __cdecl PriorityQueue::IsContainerEmpty(void)const " (?IsContainerEmpty@?$PriorityQueue@UProcessor@@@@EEBA_NXZ)

Класс с виртуальными методами
template <typename T>
class Array
{
public:
	Array(const size_t capasity) : _size(0), _capacity(capasity) {}
	virtual ~Array() = default;

	int Size() const;
	bool IsEmpty() const;
	virtual void Pop() = 0;
protected:
	virtual void Resize(const int size) = 0;
	
	size_t _size, _capacity;
};

template<typename T>
inline int Array<T>::Size() const
{
	return _size;
}

template<typename T>
inline bool Array<T>::IsEmpty() const
{
	return _size == 0;
}

Интерфейс
template <typename T>
class IContainer
{
protected:
	virtual ~IContainer() = default;

	virtual void Add(const T& item, const unsigned priority = 0) = 0;
	virtual void Remove() = 0;
	virtual const T& Show(const bool isFront = true) = 0;
	virtual bool IsContainerEmpty() const = 0;

	friend class Menu;

};

В наследуемы классах в файле .h
#include <iostream>
#include "Array.h"
#include "IContainer.h"


Как только я делаю реализацию в .h файле то ошибка пропадает, почему не видит в .cpp?
  • Вопрос задан
  • 152 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Потому что шаблон.

Надо или весь класс определять в хедере, или в array.cpp указывать компилятору генерировать инстанс шаблона с параметром, который нужен в другом cpp файле:
using Array<int>;

То же и для очереди.

Происходит это потому, что компилятор генерирует шаблоны лениво - только когда они нужны. Вот, компилируя array.cpp он не видет вообще ни одного использования шаблона и не генерирует ничего. В каком-нибудь main.cpp у него есть объявление из array.h и использование шаблона. Он и генерирует объявления методов. Но определения-то нигде нет. Оно в array.obj должно быть по вашему замыслу, а там пусто.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы