LINUX.ORG.RU

проблема с gcc (не компилирует как надо)


0

0

template <typename T> class B

{ public:

enum EEE {one, two};

};

template <typename T>

class D : public B<T>

{

void foo()

{

EEE asd;

}

};

int main()

{

return 0;

}

на такой код мне говорят, что EEE нет в текущей обсласти видимости. точнее сейчас написать не могу - нет под рукой компилятора. Компилятор от microsoft все нормально хавает. Что ему надо? Почему нормально не работает? Еще у gcc есть проблемка - он не хочет соглашаться с тем, что я пишу реализацию специализации шаблонного метода в теле класс - если вынести за пределы описания класса, то все нормально. Но это я уже понял как обходить, а вот что делать с тем кодом?

anonymous
Ответ на: комментарий от yz

спасибо, попробую А вобще зачем такой изврат. Я слышал, что gcc хороший компилятор, многие его считают лучше, чем майкрософтовский, однако он не может нормально с наследованием работать

anonymous
()
Ответ на: комментарий от anonymous

>Я слышал, что gcc хороший компилятор, многие его считают лучше, чем майкрософтовский, однако он не может нормально с наследованием работать

Ну вообще по т.н Стандарту компилятор не может вывести этот тип (EEE) без подсказки typename. По факту каждый компилятор понимает т.н Стандарт по своему.

Absurd ★★★
()
Ответ на: комментарий от yz

>typedef enum EEE {one,two} EEEE;

это конечно лишнее

>typename B<T>::EEEE asd;

здесь просто "typename B<T>::EEE asd;"

aydef
()
Ответ на: комментарий от anonymous

>спасибо, попробую А вобще зачем такой изврат. Я слышал, что gcc хороший компилятор, многие его считают лучше, чем майкрософтовский, однако он не может нормально с наследованием работать

это не изврат, а стандартное поведение - в момент декларации текущего шаблона, с++ "не смотрит" внутрь "других" шаблонов т.к. на момент использования данного шаблона, контекст "других" шаблонов может быть изменен как угодно например частичной специализацией этих шаблонов ниже по коду.

g++ лучше чем ms с++ соответствует стандарту плюс ms C++ использует кучу нестандартных расширений (-Za). вообще, для проверки сомнительного кода, пользуйтесь comeau online ( http://www.comeaucomputing.com/tryitout ) комо известен как компилятор, с наилучшим ( практически 100% ) соответствием стандарту С++.

aydef
()

>Что ему надо? Почему нормально не работает?

Он нормально работает,
он производит проверку шаблонного кода до его инстанциорования,
ms компилятор этого просто не умеет, поэтому и можно писать

template<typename T> struct Foo { void f() { все равно нифига не умеет} };

fghj ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.