Хорошо ... сначала я просто собираюсь объяснить что-то о том, как выглядит архитектура, после которой я выгляжу. C++ Как использовать шаблонные коллекции объектов шаблона с наследованием?
Я пытаюсь реализовать диспетчер статистики для объектов моей статистики. Этот менеджер статистики разработан с использованием шаблонов (см. Объявление на рис.). 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. (извините за очень длинный пост)
Чтение назад на том, что мне нужно сделать следующее ясно: StatMgr шаблонный класс: класс StatMgr {...} Subslasses из StatMgr не ... например: класс LStatMgr: общественный StatMgr { ...} –
Dennis
2010-12-02 17:44:40
вы должны уметь редактировать свой вопрос, если хотите добавить дополнительную информацию – 2010-12-02 18:00:11