Хорошо ... во-первых, я просто собираюсь объяснить кое-что о том, как выглядит архитектура, за которой я работаю.
Я пытаюсь реализовать менеджер статистики для моих объектов статистики.Этот менеджер статистики разработан с использованием шаблонов (см. Объявление на рис.). 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: 'void StatsMgr :: vPrint ()': нет подходящего определенияпредоставлено для явного запроса на создание экземпляра шаблона
. \ StatsMgr.cpp (740): предупреждение C4661: 'void StatsMgr :: vPrint ()': для явного запроса на создание экземпляра шаблона не предусмотрено подходящее определение
. \ StatsMgr.cpp (104): ошибка C2084: функция 'StatsMgr :: StatsMgr (const enum doCollect, const int)' уже имеет тело
. \ StatsMgr.cpp (104): ошибка C2084: функцияУ 'StatsMgr :: StatsMgr (const enum doCollect, const int)' уже есть тело
Теперь, что касается предупреждений :: в строке 740 имеются задержки как таковые:
template class StatsMgr<LStat>;
template class StatsMgr<RStat>;
Я добавил это, потому что, если я не сделаю этого, я получу беспорядок ошибок компоновщика (см. Их ниже).Однако существуют объявления и реализации 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.cpp
LStatMgr::LStatMgr(const doCollect eOption, const int nListSize) :
StatsMgr<LStat> (eOption, nListSize)
{
}
Я попытался подставить
class LStatMgr;
class RStatMgr;
для объявлений шаблона, и это передало ошибки компиляции, но тогда компоновщик не может найти не переопределенные функции.Например, если у меня есть функция в StatMgr с именем «getNextStat ()» и я переопределяю ее в RStatMgr, но не в LStatMgr, то компоновщик жалуется на это.Почему наследство не охватывает эту ситуацию?
Это меня огорчает.Возможно, мне придется вернуться к композиции (что должно быть предпочтительным, но не в этой ситуации).
Кстати ... Я компилирую с MSVC ++ 4.1 (!!!), поэтому я понимаю, что если вы не можете дублировать,но, пожалуйста, помогите.
Спасибо,
Деннис.(извините за очень длинный пост)