STL и Windows 64 bit
От: KARALIUS Россия http://ci-school.org
Дата: 01.08.05 12:13
Оценка:
Помогие понять. Вот на 64-битном СДК от майкрософта не могу скомпилить их же MFC-шный код, который лежит в 64-битном include:
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CAssoc*
CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::NewAssoc()
{
...
}


говорит:
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1346) : warning C4346: 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc' : dependent name is not a type prefix with 'typename' to indicate a type
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1346) : error C2143: syntax error : missing ';' before '*'
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1346) : error C2501: 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc' : missing storage-class or type spe
cifiers
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1347) : error C2065: 'KEY' : undeclared identifier
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1347) : error C2065: 'ARG_KEY' : undeclared identifier
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1347) : error C2065: 'VALUE' : undeclared identifier
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1347) : error C2065: 'ARG_VALUE' : undeclared identifier
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1347) : error C2955: 'CMap' : use of class template requires template argument list
        C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1245) : see declaration of 'CMap'
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1375) : error C2065: 'pAssoc' : undeclared identifier
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1387) : warning C4346: 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc' : dependent name is not a type
        prefix with 'typename' to indicate a type
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1387) : error C2182: 'FreeAssoc' : illegal use of type 'void'
C:\Program Files\Microsoft SDK\include\Win64\mfc\AFXTEMPL.H(1387) : error C2072: 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::FreeAssoc' : initialization of a function


Или лыжи не едут или я чего-то не понимаю. Файл AFXTEMPL.H
----
При промывке мозгов извилины стираются.
Re: STL и Windows 64 bit
От: Кодт Россия  
Дата: 01.08.05 12:19
Оценка:
Здравствуйте, KARALIUS, Вы писали:

KAR>Помогие понять. Вот на 64-битном СДК от майкрософта не могу скомпилить их же MFC-шный код, который лежит в 64-битном include:

KAR>
KAR>template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
KAR>typename CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CAssoc* // CAssoc - это имя типа в контексте CMap<.....>
KAR>CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::NewAssoc()
KAR>{
KAR>...
KAR>}
KAR>

Это связано не с 64-битностью, а с переездом на новый, более требовательный компилятор.
(Он тебе в первом же сообщении об ошибке на это намекнул.)
Может, там нужно какую-то опцию или прагму включить для обратной совместимости по дебилизации компилятора?
Перекуём баги на фичи!
Re[2]: STL и Windows 64 bit
От: KARALIUS Россия http://ci-school.org
Дата: 01.08.05 12:39
Оценка:
Здравствуйте, Кодт, Вы писали:

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


KAR>>Помогие понять. Вот на 64-битном СДК от майкрософта не могу скомпилить их же MFC-шный код, который лежит в 64-битном include:

KAR>>
KAR>>template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
KAR>>typename CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CAssoc* // CAssoc - это имя типа в контексте CMap<.....>
KAR>>CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::NewAssoc()
KAR>>{
KAR>>...
KAR>>}
KAR>>

К>Это связано не с 64-битностью, а с переездом на новый, более требовательный компилятор.
К>(Он тебе в первом же сообщении об ошибке на это намекнул.)
К>Может, там нужно какую-то опцию или прагму включить для обратной совместимости по дебилизации компилятора?
Не совсем понял... Вот, например
template<class TYPE, class ARG_TYPE>
class CList : public CObject
{
protected:
    struct CNode
    {
        CNode* pNext;
        CNode* pPrev;
        TYPE data;
    };
И так далее...

а потом 
template<class TYPE, class ARG_TYPE>
void CList<TYPE, ARG_TYPE>::FreeNode(CList::CNode* pNode)


Куда вставить этот typename?
Я не силен в STL'е, так что не обессудьте если вопрос глупый.
----
При промывке мозгов извилины стираются.
Re[3]: STL и Windows 64 bit
От: Павел Кузнецов  
Дата: 01.08.05 13:06
Оценка:
KARALIUS,

K>
 K> template<class TYPE, class ARG_TYPE>
 K> void CList<TYPE, ARG_TYPE>::FreeNode(CList::CNode* pNode)
 K>


K> Куда вставить этот typename?


Сюда:
template<class TYPE, class ARG_TYPE>
void CList<TYPE, ARG_TYPE>::FreeNode(typename CList::CNode* pNode)


K> Я не силен в STL'е, так что не обессудьте если вопрос глупый.


STL здесь вообще ни при чем. Примеры ты приводишь из MFC.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: STL и Windows 64 bit
От: Кодт Россия  
Дата: 01.08.05 13:08
Оценка:
Здравствуйте, KARALIUS, Вы писали:

KAR>Куда вставить этот typename?

KAR>Я не силен в STL'е, так что не обессудьте если вопрос глупый.

Действительно, я мало-мало перебдел. Здесь typename не нужен. (Кстати, это относится не к STL, а к синтаксису языка).
По этому поводу компилятор сообщил всего лишь warning.

Возможно, ошибка в другом.
Я не сразу обратил внимание на вот этот симптомчик:
error C2143: syntax error : missing ';' before '*'


Такое чаще всего бывает, когда в одном из заголовочников забыли поставить ";" после объявления класса... или чего-нибудь в таком роде.
Посмотри, что у тебя включено перед afxtempl.h — на предмет криминала.
Поменяй порядок включений.

Хотя странно, что рвануло посередине файла.
Перекуём баги на фичи!
Re[3]: STL и Windows 64 bit
От: loki1000 Украина  
Дата: 01.08.05 13:09
Оценка:
Здравствуйте, KARALIUS, Вы писали:

KAR>
KAR>template<class TYPE, class ARG_TYPE>
KAR>void CList<TYPE, ARG_TYPE>::FreeNode(typename CList<TYPE,ARG_TYPE>::CNode* pNode)
KAR>


KAR>Я не силен в STL'е, так что не обессудьте если вопрос глупый.


Это скорее ATL...
Re[4]: STL и Windows 64 bit
От: KARALIUS Россия http://ci-school.org
Дата: 01.08.05 13:10
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>KARALIUS,


K>>
 K>> template<class TYPE, class ARG_TYPE>
 K>> void CList<TYPE, ARG_TYPE>::FreeNode(CList::CNode* pNode)
 K>>


K>> Куда вставить этот typename?


ПК>Сюда:

ПК>
ПК>template<class TYPE, class ARG_TYPE>
ПК>void CList<TYPE, ARG_TYPE>::FreeNode(typename CList::CNode* pNode)
ПК>


K>> Я не силен в STL'е, так что не обессудьте если вопрос глупый.


ПК>STL здесь вообще ни при чем. Примеры ты приводишь из MFC.


Спасибо, телевизор заработал. Пример из MFC, это да, я имел ввиду, что шаблонами не приходилось заниматься почти никогда
----
При промывке мозгов извилины стираются.
Re: STL и Windows 64 bit
От: SkyDance Земля  
Дата: 02.08.05 05:31
Оценка:
Кстати, еще о 64-бит, Microsoft, AMD64 и пр.
В новом crt, куда они приложили и слегка поменянный STL, из auto_ptr пропала операция reset(). А из basic_string — функция clear()
Заодно пропали stdext::hash_set & hash_map.
Никаких объяснений по этому поводу я не нашел. В чем может быть дело — я плохо искал, или об этом говорили раньше?
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.