Господа, возникло несколько проблем с gcc компилятором. До этого писалось все на MSVS 7.1.
1) В gcc осуществляется поиск имен в функциях шаблонных классов.
Например:
template <class T>
struct A {
int f() { return sin(5); }
};
В вижаке анализ тела функции происходит только в случае вызова метода. Соотв. в классах, где A::f() не используется
и не определена функция sin — все отлично компилируется и работает.
Собственно, проблема в том, что выражение sin(5) от шаблонного аргумента не зависит, и, соответственно, gcc может сразу сделать поиск имен...
Можно ли отключить эту модную "фичу"? Какие ключики для gcc обычно используются?
2) Вторая проблема — gcc начал ругаться на запись вида
struct A {
virtual void f() = 0 {}
};
Якобы нельзя одновременно говорить, что функция абстрактная и определять ее тело.
Является ли данная запись стандартной и можно ли указать какаой-нибудь ключик, чтобы это дело заработало?..
Буду мегаблагодарен за любые советы.
Здравствуйте, Evgeniy13, Вы писали:
E>Господа, возникло несколько проблем с gcc компилятором. До этого писалось все на MSVS 7.1.
E>1) В gcc осуществляется поиск имен в функциях шаблонных классов.
E>Например:
E>E>template <class T>
E>struct A {
E> int f() { return sin(5); }
E>};
E>
E>В вижаке анализ тела функции происходит только в случае вызова метода. Соотв. в классах, где A::f() не используется
E>и не определена функция sin — все отлично компилируется и работает.
E>Собственно, проблема в том, что выражение sin(5) от шаблонного аргумента не зависит, и, соответственно, gcc может сразу сделать поиск имен...
E>Можно ли отключить эту модную "фичу"? Какие ключики для gcc обычно используются?
GCC 3.3 -> 3.4.
В новых версиях гцц появился двухфазный поиск имен в шаблонах, что не поддерживают компиляторы MSVC (принципиально). Нужно, по-видимому, добавить предварительные объявления для независимых имен в шаблонах.
E>2) Вторая проблема — gcc начал ругаться на запись вида
E>E>struct A {
E> virtual void f() = 0 {}
E>};
E>
E>Якобы нельзя одновременно говорить, что функция абстрактная и определять ее тело.
E>Является ли данная запись стандартной и можно ли указать какаой-нибудь ключик, чтобы это дело заработало?..
Это вроде как правильное (стандартное) поведение. Нужно вынести определение тела функции наружу из класса:
struct A {
virtual void f(); // = 0 {}
};
void A::f() {}
Здравствуйте, Warturtle, Вы писали:
W>Здравствуйте, Evgeniy13, Вы писали:
В смысле,
W>W>struct A {
W> virtual void f() = 0; // {}
W>};
W>
void A::f() {}
W>