Шаблоны C++. Непонятная конструкция
От: blackliteon  
Дата: 19.10.05 08:42
Оценка:
Из-за нехватки знаний не могу понять смысл конструкции

template <class A,class B,class C,class D> CMap<A,B,C,D>::Assoc* CMAP<A,B,C,D>::NewAssoc() { ...

Gcc 3.4.4 ругается на ...::Assoc*;

expected constructor,destructor before *
Re: Шаблоны C++. Непонятная конструкция
От: Lorenzo_LAMAS  
Дата: 19.10.05 08:44
Оценка: +1
Здравствуйте, blackliteon, Вы писали:

B>Из-за нехватки знаний не могу понять смысл конструкции


Ну, это определение функции. А чтоб gcc не ругался, пиши так
B>template <class A,class B,class C,class D> typename CMap<A,B,C,D>::Assoc* CMAP<A,B,C,D>::NewAssoc() { ...

B>Gcc 3.4.4 ругается на ...::Assoc*;

B>expected constructor,destructor before *
Of course, the code must be complete enough to compile and link.
Re: Шаблоны C++. Непонятная конструкция
От: jazzer Россия Skype: enerjazzer
Дата: 19.10.05 08:44
Оценка:
Здравствуйте, 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 *


напиши спереди typename
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Шаблоны C++. Непонятная конструкция
От: Bell Россия  
Дата: 19.10.05 08:47
Оценка:
Здравствуйте, 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:
template <class A,class B,class C,class D> typename CMap<A,B,C,D>::Assoc* CMAP<A,B,C,D>::NewAssoc() { ...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Шаблоны C++. Непонятная конструкция
От: blackliteon  
Дата: 19.10.05 08:59
Оценка:
Здравствуйте, 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>
B>template <class A,class B,class C,class D> typename CMap<A,B,C,D>::Assoc* CMAP<A,B,C,D>::NewAssoc() { ...
B>


Хм.... Спасибо.
Далее
CMap::CAssoc* pAssoc = (CMap::CAssoc*) ...;
ругается на pAssoc. (pAssoc undeclared) Неправильная семантика?
Re[3]: Шаблоны C++. Непонятная конструкция
От: Bell Россия  
Дата: 19.10.05 09:04
Оценка:
Здравствуйте, blackliteon, Вы писали:

B>Хм.... Спасибо.

На здоровье
B>Далее
B>CMap::CAssoc* pAssoc = (CMap::CAssoc*) ...;
B>ругается на pAssoc. (pAssoc undeclared) Неправильная семантика?
Похоже, что компилятор считает конструкцию CMap::CAssoc* pAssoc за умножение, и, что самое интересное, он прав
Так что не стейсняйся, добавь typename и здесь:

typename CMap::CAssoc* pAssoc = ...;
Любите книгу — источник знаний (с) М.Горький
Re[4]: Шаблоны C++. Непонятная конструкция
От: blackliteon  
Дата: 19.10.05 09:15
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, blackliteon, Вы писали:


B>>Хм.... Спасибо.

B>На здоровье
B>>Далее
B>>CMap::CAssoc* pAssoc = (CMap::CAssoc*) ...;
B>>ругается на pAssoc. (pAssoc undeclared) Неправильная семантика?
B>Похоже, что компилятор считает конструкцию CMap::CAssoc* pAssoc за умножение, и, что самое интересное, он прав
B>Так что не стейсняйся, добавь typename и здесь:

B>
B>typename CMap::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 нужен ещё? Не могу сообразить где..
Re[5]: Шаблоны C++. Непонятная конструкция
От: Bell Россия  
Дата: 19.10.05 09:24
Оценка:
Здравствуйте, blackliteon, Вы писали:

B>Насколько понимаю typename нужен ещё? Не могу сообразить где..

Компилятор же все сказал!
В функции NewAssoc
In member function `typename CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CAssoc* CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::NewAssoc()...

нужно добавить typename:
say `typename  CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc' if a type is meant
Любите книгу — источник знаний (с) М.Горький
Re[5]: Шаблоны C++. Непонятная конструкция
От: jazzer Россия Skype: enerjazzer
Дата: 19.10.05 09:30
Оценка:
Здравствуйте, blackliteon, Вы писали:

B>Насколько понимаю typename нужен ещё? Не могу сообразить где..


Запомни простое правило: когда компилятор видит запись типа A::B, где А — это шаблон (т.е. B является зависимым именем и на самом деле, в зависимости от специализации шаблона, может быть как типом, как в твоем случае, так и обычным членом), компилятор предполагает, что В является обычным членом, если явно не указано обратное (при помощи typename).

Для тебя это означает, что почти везде при ссылке на тип, объявленный внутри шаблона (в твоем случае это CMap::CAssoc), тебе придется писать спереди typename.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Шаблоны C++. Непонятная конструкция
От: Кодт Россия  
Дата: 19.10.05 09:32
Оценка: 1 (1) +1 :)
Здравствуйте, blackliteon, Вы писали:

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*;


"Я вашу полечку на русский язык перепёр", а ты перепираешь MFC на gcc. Героически, но зачем?
Там же столько MS-specific вылезет.
Перекуём баги на фичи!
Re[6]: Шаблоны C++. Непонятная конструкция
От: blackliteon  
Дата: 19.10.05 09:36
Оценка:
Здравствуйте, 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>


Большое спасибо, Bell!
Всё получилось!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.