warning: implicit typename is deprecated

SCIF32

Баг или фича?
Надо ли (и КАК?) избавляться от таких варнингов?
Если не надо - можно ли в gcc отключить только такие варнинги?

rosali

(и КАК?)
Писать слово "typename" в нужном месте?

SCIF32

на самом деле полностью ошибка такая:
ierarhy/seq_tree.h:123: warning: `AttGraphAdvanced<VKey, long int, typename
Alphabet::symbol>::Edges' is implicitly a typename
ierarhy/seq_tree.h:123: warning: implicit typename is deprecated, please see
the documentation for details
а код такой:
SCM::Edges edges=(*scheme).getChildren(*i);
вроде фича в том, что ентому компилятору не нравится, что SCM::Edges typename.
но убирать typenam-ы не охота - дофига их.

rosali

SCM::Edges edges=(*scheme).getChildren(*i);
Надо писать
 
typename SCM::Edges;
SCM::Edges edges=(*scheme).getChildren(*i);
Может и в одну строчку можно, не знаю.
что ентому компилятору не нравится, что SCM::Edges typename.
Это я вообще не понял, что ты сказал Чего там кому не нравится

SCIF32

Всё! вспомнил нормальный пример:
код такой (класс наследуется от AttGraphAdvanced<VKey, VVal, EdgeVal>, в котором объявлен тип Edges):
const Edges&
getEdgesRev const
{
return E_rev_;
}
ошибка:
ierarhy/automat_new.h|13| warning: `AttGraphAdvanced<VKey, VVal,
|| EdgeVal>::Edges' is implicitly a typename
ierarhy/automat_new.h|13| warning: implicit typename is deprecated, please see
|| the documentation for details
Проблема:
Не знаю, как грамотно переписать, что бы варнинга не было.
если тупо дописывать typename, то естественно вылазит
parse error before ;

Dasar

перед Edges пробовал typename писать?
именно перед словом Edges?

xronik111

В gcc начиная с 3.4 улучшили соответстивие стандарту С++. Соответственно, в 3.3.х много всего deprecated. Авторы gcc советуют ботать список изменений в сериях 3.4.х.

SCIF32

везде писал - не пашет.

SCIF32

я в курсе, что это изменение в 3.4.х
только какой смысл ботать этот список - там написано, как бороться с описанной проблемой?

xronik111

Сразу по ссылке, разве не оно? Да и это же советовал.

struct K {
typedef int mytype_t;
};

template <class T1> struct A {
template <class T2> struct B {
void callme(void);
};

template <int N> void bar(void)
{
// Use 'typename' to tell the parser that T1::mytype_t names
// a type. This is needed because the name is dependent (in
// this case, on template parameter T1).
typename T1::mytype_t x;
x = 0;
}
};
Оставить комментарий
Имя или ник:
Комментарий: