Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемное наследование шаблона класса

35K
29 января 2008 года
bumper
6 / / 29.01.2008
// Man.h
Код:
template <class T>  class CManager
{
//...
public:
    void AddItem(T* NewItem);
};

class CItem
{
//....
};

class CManOfItem: public CManager<CItem>
{
public:
    CManOfItem() { /*... */ }; 
};



// Man.cpp
#include "man.h"
 
Код:
template <class T> void CManager<T>::AddItem(T* NewItem)
{
/* .... */
}



// Main.cpp
Код:
#include "man.h"

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:
Как тут быть? Неужто глупой писаниной придётся заниматься?
Помогите, спецы многогопытные, чайнику тёмно-зелёному, только начинающему светлеть (т.е. мне) :)
505
29 января 2008 года
vAC
343 / / 28.02.2006
Недавно обсуждалось.
Убейте Man.cpp, перенесите его код в Man.h
Как вы себе представляете откомпилированный шаблонный класс?
35K
29 января 2008 года
bumper
6 / / 29.01.2008
вот так фокус... работает....
Причина видимо здесь:
Цитата:
Как вы себе представляете откомпилированный шаблонный класс?


Представляю смутно, но что-то начинает из тумана вырисовываться...про первое определение шаблона...

Спасибо, пойду искать где недавно обсуждалось....

Добавлю:
Где обсуждадлось - не нашёл :(
А так работает , но если этот файл man.h (всё в одном) подключить несколько раз, то ошибка линкера: что-то типа already defined....

И вообще, для меня ошибки unresolved external symbols, или вышеупомянутая - головная боль.... Вкратце, как решить проблему со множествеенным включением файла *.h, в котором есть определения функций?...

505
31 января 2008 года
vAC
343 / / 28.02.2006
 
Код:
#pragma once


здесь
309
01 февраля 2008 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Вкратце, как решить проблему со множествеенным включением файла *.h, в котором есть определения функций?...


Баян конечно, но работает

 
Код:
// Файло Defines.h
#ifndef DEFINES_H
#define DEFINES_H
// Куча кода объявлений функций
#endif //DEFINES_H
// конец файла
35K
02 февраля 2008 года
bumper
6 / / 29.01.2008
Цитата: el scorpio
Баян конечно, но работает
 
Код:
// Файло Defines.h
#ifndef DEFINES_H
#define DEFINES_H
// Куча кода объявлений функций
#endif //DEFINES_H
// конец файла




Этот баян как раз то я и и спользую в каждом *.h файле....
Но так и не понял, почему он прокатывает для объявления, но если встречается определение в *.h файле между #ifndef и #endif (например в случае, когда и описание, и определение шаблона советуют хранить в одном фале ), то линкер ведёт себя так, как будто эти директив не существует... т.е... already defined.... Скорее всего, что при чтении умных книг я где-то что-то упустил и неправильно понимаю...:)
Разъясниете, пожалуйста, знающие, где я ошибаюсь....

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог