используя g ++, как отказаться от функций-членов виртуального класса - PullRequest
4 голосов
/ 02 декабря 2010

У меня возникают проблемы с выводом на печать устаревших предупреждений для функций, объявленных как виртуальные. Я использую "g ++ (GCC) 4.1.1 20061011 (Red Hat 4.1.1-30)". Мои исследования показывают, что в gcc 4.x могут быть проблемы с устареванием чисто виртуальные функции (т.е. класс bueller {virtual int cameron () = 0;};), но не ... я думаю, вы бы назвали их обычными ... виртуальными функциями. Просто мы на одной странице ...

foo.h

class Foo
{
  void Foo_A() __attribute__((deprecated)); //non-virtual
  virtual void Foo_B() __attribute__((deprecated)); //virtual
  virtual void Foo_C() __attribute__((deprecated)) = 0; //pure virtual
};

Скажем, я скомпилировал это, файл foo.cpp и некоторый файл main.cpp, используя g ++.

1) Все, что использует Foo_A (), действительно будет показывать предупреждение.

2) Все, что использует Foo_B (), НЕ показывает предупреждение.

3) Все, что наследует Foo, реализует Foo_C и затем использует его, не отображает предупреждение.

Номер 1: все работает, без проблем.

Номер 3: похоже на известную ошибку / функцию ... что угодно ..

Похоже, что нет объяснения №2. Возможно, это связано с № 3, хотя ничего из того, что я нашел, не упоминает об этом.

Кто-нибудь знает, если я что-то здесь упускаю в отношении обычных функций-членов виртуального класса, которые я хочу исключить?

Кстати: -Wno-deprecate НЕ включен в моих make-файлах.

Ответы [ 3 ]

1 голос
/ 18 декабря 2010

Учитывая эту программу:

struct Foo
{
  virtual void Foo_B() __attribute__((deprecated)); //virtual
};

struct DerivedFoo : public Foo
{
};


int main()
{
  DerivedFoo d;
  d.Foo_B();
  Foo &f = d;
  f.Foo_B();
}
void Foo::Foo_B() {}

На CentOS 5.2 (gcc версии 4.1.2 20080704 (Red Hat 4.1.2-44)) я получаю тот же вывод, который вы описываете:

g++     deprecate.cc   -o deprecate
deprecate.cc: In function ‘int main()’:
deprecate.cc:14: warning: ‘Foo_B’ is deprecated (declared at deprecate.cc:3)

Но в Ubuntu 10.04.1 (версия gcc 4.4.3 (Ubuntu 4.4.3-4ubuntu5)) я получаю ожидаемый вывод:

g++     deprecate.cc   -o deprecate
deprecate.cc: In function ‘int main()’:
deprecate.cc:14: warning: ‘virtual void Foo::Foo_B()’ is deprecated (declared at deprecate.cc:3)
deprecate.cc:16: warning: ‘virtual void Foo::Foo_B()’ is deprecated (declared at deprecate.cc:3)

Итак, я думаю, это была ошибка компилятора, которая была исправлена.

0 голосов
/ 02 декабря 2010

Google показывает старую дискуссию на эту тему в списке Debian. Но ничего более свежего не возникает по этой теме. Попробуйте спросить списки рассылки (в данном случае RedHat).

0 голосов
/ 02 декабря 2010

Вы вызываете Foo_B () / Foo_C () через указатель / ссылку Foo или производный класс? Если вы используете производный класс, кажется, что вы должны также пометить методы, в которых он устарел, или вы получите поведение, которое вы описали.

...