Проблемное наследование шаблона класса
{
//...
public:
void AddItem(T* NewItem);
};
class CItem
{
//....
};
class CManOfItem: public CManager<CItem>
{
public:
CManOfItem() { /*... */ };
};
// Man.cpp
#include "man.h"
{
/* .... */
}
// Main.cpp
CItem* item;
CManOfItem* MOItem;
int _tmain(int argc, _TCHAR* argv[])
{
MOItem = new CManOfItem();
item = new CItem();
MOItem->AddItem(item);
delete item;
delete MOItem;
return 0;
}
Компилятор Microsoft Visual C++ 2005,+SP1 ....
Чего ж он, зараза, вот так ругается?:
Main.obj : error LNK2019: unresolved external symbol "public: void __thiscall CManager<class CItem>::AddItem(class CItem *)" (?AddItem@?$CManager@VCItem@@@@QAEXPAVCItem@@@Z) referenced in function . . . : fatal error LNK1120: 1 unresolved externals
Это что, нужно для всех потомков, порождённых от конкретизаций шаблонного класса CManager переопределять все его функции? :)
И ещё.. где-то вычитал, про ключевое слово export в определении шаблонного класса, вроде могущего помочь в этом... но сей компилер пишет , что слово такое знаю, а делать с ним пока ничего не умею :confused:
Как тут быть? Неужто глупой писаниной придётся заниматься?
Помогите, спецы многогопытные, чайнику тёмно-зелёному, только начинающему светлеть (т.е. мне) :)
Убейте Man.cpp, перенесите его код в Man.h
Как вы себе представляете откомпилированный шаблонный класс?
Причина видимо здесь:
Представляю смутно, но что-то начинает из тумана вырисовываться...про первое определение шаблона...
Спасибо, пойду искать где недавно обсуждалось....
Добавлю:
Где обсуждадлось - не нашёл :(
А так работает , но если этот файл man.h (всё в одном) подключить несколько раз, то ошибка линкера: что-то типа already defined....
И вообще, для меня ошибки unresolved external symbols, или вышеупомянутая - головная боль.... Вкратце, как решить проблему со множествеенным включением файла *.h, в котором есть определения функций?...
Баян конечно, но работает
#ifndef DEFINES_H
#define DEFINES_H
// Куча кода объявлений функций
#endif //DEFINES_H
// конец файла
#ifndef DEFINES_H
#define DEFINES_H
// Куча кода объявлений функций
#endif //DEFINES_H
// конец файла
Этот баян как раз то я и и спользую в каждом *.h файле....
Но так и не понял, почему он прокатывает для объявления, но если встречается определение в *.h файле между #ifndef и #endif (например в случае, когда и описание, и определение шаблона советуют хранить в одном фале ), то линкер ведёт себя так, как будто эти директив не существует... т.е... already defined.... Скорее всего, что при чтении умных книг я где-то что-то упустил и неправильно понимаю...:)
Разъясниете, пожалуйста, знающие, где я ошибаюсь....