Проблемы с gnu компилером
От: Evgeniy13 Россия  
Дата: 11.10.06 13:11
Оценка:
Господа, возникло несколько проблем с 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 {}
};


Якобы нельзя одновременно говорить, что функция абстрактная и определять ее тело.
Является ли данная запись стандартной и можно ли указать какаой-нибудь ключик, чтобы это дело заработало?..

Буду мегаблагодарен за любые советы.
Не все в этом мире можно выразить с помощью нулей и единиц...
Re: Проблемы с gnu компилером
От: Evgeniy13 Россия  
Дата: 12.10.06 11:19
Оценка:
А может gcc всегда проверял имена в шаблонах и проч.?
Че-то не верится... :\
Не все в этом мире можно выразить с помощью нулей и единиц...
Re: Проблемы с gnu компилером
От: Warturtle  
Дата: 13.10.06 12:13
Оценка:
Здравствуйте, 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 -&gt; 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() {}
Re[2]: Проблемы с gnu компилером
От: Warturtle  
Дата: 13.10.06 12:16
Оценка:
Здравствуйте, Warturtle, Вы писали:

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

В смысле,
W>
W>struct A {
W>  virtual void f() = 0; // {}
W>};
W>void A::f() {}
W>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.