День добрый! Видимо ночь, поэтому не соображаю
template<class _Type> class A
{
public:
typedef typename _Type* iterator;
};
int main()
{
A<int> r;
return 0;
};
g++ версии 4.1.1 ругается:
test.cpp:4: error: expected nested-name-specifier before '_Type'
test.cpp:4: error: expected ';' before '*' token
А мелкософтовский компиллер съедает с удовольствием такую конструкцию.
С уважением,
Михаил Белов
Posted via RSDN NNTP Server 2.0
Здравствуйте, coreduo, Вы писали:
C>День добрый! Видимо ночь, поэтому не соображаю
C>template<class _Type> class A
C>{
C>public:
C>typedef typename _Type* iterator;
C>};
C>g++ версии 4.1.1 ругается:
C>test.cpp:4: error: expected nested-name-specifier before '_Type'
C>test.cpp:4: error: expected ';' before '*' token
C>А мелкософтовский компиллер съедает с удовольствием такую конструкцию.
а зачем там ставить typename ? если б было так —
template<class _Type> class A
{
public:
typedef typename some_temlate_class< _Type >::value * iterator;
};
тогда все понятно.
а так — _Type и так тип, и _Type * тоже тип. какая тут неопределенность ?
Предположу, что нужно писать:
template<typename _Type> class A
Проверить не могу, т.к. еще еду на работу в метро.
Здравствуйте, coreduo, Вы писали:
C>...
C>g++ версии 4.1.1 ругается:
C>test.cpp:4: error: expected nested-name-specifier before '_Type'
C>test.cpp:4: error: expected ';' before '*' token
Все правильно. Достаточно заглянуть в Стандарт (5.2):
postfix-expression:
typename ::opt nested-name-specifier identifier ( expression-listopt )
C>А мелкософтовский компиллер съедает с удовольствием такую конструкцию.
Ну, соответствие MSVC Стандарту — известная беда.