2010-12-02 2 views
5

Хорошо ... сначала я просто собираюсь объяснить что-то о том, как выглядит архитектура, после которой я выгляжу. StatMgrC++ Как использовать шаблонные коллекции объектов шаблона с наследованием?

Я пытаюсь реализовать диспетчер статистики для объектов моей статистики. Этот менеджер статистики разработан с использованием шаблонов (см. Объявление на рис.). StatMgr содержит карту (а не STL), которая сопоставляет реализацию строки с интеллектуальным указателем (который также является шаблоном), ARef. Конкретные подклассы StatMgr статически объявляют класс шаблонов их родительского StatMgr при построении (см. LStatMgr и RStatMgr), и поэтому сами по себе не являются шаблонами.
Это позволяет мне делать такие вещи, как:

LStatMgr myLStatMgr(10); 
if(myLStatMgr.remove(acKey)) 
    cout << "Remove was good" << endl; 
//No need to delete :) 

ИЛИ

ARef<LStat> oLStat = NULL; 
myLStatMgr.getNextStat(acKey,oLStat); 
if(oLStat != NULL) 
    oLStat->doSomethingLStatLike(); 

Однако это было до господина линкера и госпожой компилятором решили объединить усилия и сорвать мои попытки прогресса (я до сих пор проверить функциональность и использование памяти!).
Как она стоит у меня есть следующее сообщение об ошибке и предупреждения на класс стата:.

\ StatsMgr.cpp (740): предупреждение C4661: 'пустоты StatsMgr :: vPrint()': нет подходящего определения при условии запроса явного шаблона экземпляра
\ StatsMgr.cpp (740). предупреждение C4661: 'пустоты StatsMgr :: vPrint()':. не подходит определения при условии явного запроса экземпляра шаблона
\ StatsMgr.cpp (104): ошибка C2084: Функция 'StatsMgr :: StatsMgr (Const перечисление doCollect, Const целое)' уже имеет тело
\ StatsMgr.cpp (104). Ошибка C2084: функция «StatsMgr :: StatsMgr (Const перечисление doCollect, Const целое) 'уже тело

Теперь о предупреждениях :: на линии 740 существуют delarations как так:

template class StatsMgr<LStat>; 
template class StatsMgr<RStat>; 

Я добавил это, потому что, если я не сделайте это, тогда я получаю беспорядок ошибок компоновщика (см. их ниже). Однако там ARE объявления и реализации vPrint() во всех подклассах Stat!

Об ошибках: Базовый класс «StatsMgr» имеет определенный COTR, ​​также как и подклассы (LStatMgr & RStatMgr). Почему наследование не просто сортирует это? Очевидно, что это связано с явным экземпляром шаблона в конце CPP, но я не могу понять, что именно происходит.
Ниже от StatsMgr.cpp

template<class type> 
StatsMgr<type>::StatsMgr(const doCollect eOption, const int nListSize) : 
    oMyMap(wHashString, nListSize), oMyMapIter(oStatsList) 
{ 
    m_eCollectionOption = eOption; 
} 

Ниже от LStatMgr.каст

LStatMgr::LStatMgr(const doCollect eOption, const int nListSize) : 
StatsMgr<LStat> (eOption, nListSize) 
{ 
} 

Я попытался подставляя

class LStatMgr; 
class RStatMgr; 

для объявлений шаблонов, и это получает прошло ошибку компиляции, но то линкер не может найти не-переопределить функции. Например, если у меня есть функция в StatMgr с именем «getNextStat()» и переопределить это в RStatMgr, но не в LStatMgr, тогда компоновщик жалуется на это. Почему наследование не покрывает эту ситуацию?



Мне грустно. Мне, возможно, придется вернуться к композиции (что должно быть предпочтительным, но не в этой ситуации).
Кстати ... Я компилирую с MSVC++ 4.1 (!!!), поэтому я понимаю, если вы не можете дублировать, но, пожалуйста, помогите.
Thanks,
Dennis. (извините за очень длинный пост)

+0

Чтение назад на том, что мне нужно сделать следующее ясно: StatMgr шаблонный класс: класс StatMgr {...} Subslasses из StatMgr не ... например: класс LStatMgr: общественный StatMgr { ...} – Dennis 2010-12-02 17:44:40

+0

вы должны уметь редактировать свой вопрос, если хотите добавить дополнительную информацию – 2010-12-02 18:00:11

ответ

2

Поместите код шаблона непосредственно в заголовок, а не в отдельный файл CPP.

Факс: this previous question для фона.

EDIT: btw Я вижу, что вы находитесь на очень старом компиляторе - эта проблема может быть непреодолимой, даже VC6 был отрывочным для шаблонов.

Смежные вопросы