C ++ Как я могу использовать коллекции шаблонов объектов-шаблонов с наследованием? - PullRequest
5 голосов
/ 02 декабря 2010

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

Я пытаюсь реализовать менеджер статистики для моих объектов статистики.Этот менеджер статистики разработан с использованием шаблонов (см. Объявление на рис.). 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 (!!!), поэтому я понимаю, что если вы не можете дублировать,но, пожалуйста, помогите.
Спасибо,
Деннис.(извините за очень длинный пост)

1 Ответ

2 голосов
/ 02 декабря 2010

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

См. этот предыдущий вопрос для фона.

РЕДАКТИРОВАТЬ: кстати я вижу, вына очень старом компиляторе - эта проблема может быть непреодолимой, даже VC6 был отрывочен для шаблонов.

...