Здравствуйте, blackliteon, Вы писали:
B>Из-за нехватки знаний не могу понять смысл конструкции
B>template <class A,class B,class C,class D> CMap<A,B,C,D>::Assoc* CMAP<A,B,C,D>::NewAssoc() { ...
B>Gcc 3.4.4 ругается на ...::Assoc*;
B>expected constructor,destructor before *
Это функция NewAssoc, возврашабшая указаель на объект типа Assoc, тип Assoc объявлен внутри шаблона CMap.
А ошибка возникает из-за отсутствия typename:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, blackliteon, Вы писали:
B>>Из-за нехватки знаний не могу понять смысл конструкции
B>>template <class A,class B,class C,class D> CMap<A,B,C,D>::Assoc* CMAP<A,B,C,D>::NewAssoc() { ...
B>>Gcc 3.4.4 ругается на ...::Assoc*;
B>>expected constructor,destructor before *
B>Это функция NewAssoc, возврашабшая указаель на объект типа Assoc, тип Assoc объявлен внутри шаблона CMap. B>А ошибка возникает из-за отсутствия typename: B>
Здравствуйте, blackliteon, Вы писали:
B>Хм.... Спасибо.
На здоровье B>Далее B>CMap::CAssoc* pAssoc = (CMap::CAssoc*) ...; B>ругается на pAssoc. (pAssoc undeclared) Неправильная семантика?
Похоже, что компилятор считает конструкцию CMap::CAssoc* pAssoc за умножение, и, что самое интересное, он прав
Так что не стейсняйся, добавь typename и здесь:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, blackliteon, Вы писали:
B>>Хм.... Спасибо. B>На здоровье B>>Далее B>>CMap::CAssoc* pAssoc = (CMap::CAssoc*) ...; B>>ругается на pAssoc. (pAssoc undeclared) Неправильная семантика? B>Похоже, что компилятор считает конструкцию CMap::CAssoc* pAssoc за умножение, и, что самое интересное, он прав B>Так что не стейсняйся, добавь typename и здесь:
B>
B>typenameCMap::CAssoc* pAssoc = ...;
B>
Спасибо за помощь!
In member function `typename CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CAssoc* CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::NewAssoc() [with KEY = long int, ARG_KEY = long int, VALUE = CDictsArray*, ARG_VALUE = CDictsArray*]':
ad.h:673: instantiated from `VALUE& CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::operator[](ARG_KEY) [with KEY = long int, ARG_KEY = long int, VALUE = CDictsArray*, ARG_VALUE = CDictsArray*]'
ad.h:495: instantiated from `void CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::SetAt(ARG_KEY, ARG_VALUE) [with KEY = long int, ARG_KEY = long int, VALUE = CDictsArray*, ARG_VALUE = CDictsArray*]'
dictsmap.cpp:23: instantiated from here
colprm.h:589: error: dependent-name ` CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc' is parsed as a non-type, but instantiation yields a type
colprm.h:589: note: say `typename CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc' if a type is meant
Насколько понимаю typename нужен ещё? Не могу сообразить где..
Здравствуйте, blackliteon, Вы писали:
B>Насколько понимаю typename нужен ещё? Не могу сообразить где..
Запомни простое правило: когда компилятор видит запись типа A::B, где А — это шаблон (т.е. B является зависимым именем и на самом деле, в зависимости от специализации шаблона, может быть как типом, как в твоем случае, так и обычным членом), компилятор предполагает, что В является обычным членом, если явно не указано обратное (при помощи typename).
Для тебя это означает, что почти везде при ссылке на тип, объявленный внутри шаблона (в твоем случае это CMap::CAssoc), тебе придется писать спереди typename.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, blackliteon, Вы писали:
B>>Насколько понимаю typename нужен ещё? Не могу сообразить где.. B>Компилятор же все сказал! B>В функции NewAssoc B>
B>In member function `typename CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CAssoc* CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::NewAssoc()...
B>
B>нужно добавить typename: B>
B>say `typename CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc' if a type is meant
B>