Почему ошибка выдается два раза? - PullRequest
3 голосов
/ 20 августа 2010

Полностью осознавая, что вопрос, который я задаю, выходит за рамки стандарта C ++, мне любопытно узнать, почему GCC выдает одну и ту же ошибку дважды? Я знаю, почему возникает ошибка, но я с нетерпением жду, чтобы понять причину дублирования в сообщении об ошибке.

#include <iostream>
using namespace std;

struct A{
   virtual void f1() = 0;
};

struct B : A{
};

struct C : A{
   void f1(){}
};

struct D : C, B{
   void f2(){f1();}
};

int main(){}

Ошибка:

prog.cpp: In member function ‘void D::f2()’:
prog.cpp:16: error: reference to ‘f1’ is ambiguous
prog.cpp:5: error: candidates are: virtual void A::f1()
prog.cpp:12: error:                virtual void C::f1()
prog.cpp:16: error: reference to ‘f1’ is ambiguous
prog.cpp:5: error: candidates are: virtual void A::f1()
prog.cpp:12: error:                virtual void C::f1()

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Какую версию G ++ вы используете?

Интересно, что при компиляции кода, который вы показываете на MacOS X 10.6.4, с использованием Apple G ++ 4.2.1, я получаю двойное сообщение об ошибке.

С моей собственной сборкой G ++ 4.5.1 я получаю только одно предупреждение.

Похоже, что была исправлена ​​ошибка.

0 голосов
/ 20 августа 2010

С gcc используйте -fmessage-length = 0, чтобы избежать прерывания сообщений. http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Language-Independent-Options.html#index-diagnostic-messages-211

0 голосов
/ 20 августа 2010

Моим первым предположением была одна ошибка на неоднозначность:

#include <iostream>

using namespace std;

struct A{
   virtual void f1() = 0;
};

struct B : A{
};

struct C : A{
   void f1(){}
};



struct CPrime : A{
   void f1() {}
};

struct D : C, B, CPrime {
   void f2(){f1();}
};

int main(){ return 0; }

Но нет:

g++ prog.cpp
prog.cpp: In member function ‘void D::f2()’:
prog.cpp:20: error: reference to ‘f1’ is ambiguous
prog.cpp:5: error: candidates are: virtual void A::f1()
prog.cpp:16: error:                 virtual void CPrime::f1()
prog.cpp:5: error:                 virtual void A::f1()
prog.cpp:12: error:                 virtual void C::f1()
prog.cpp:20: error: reference to ‘f1’ is ambiguous
prog.cpp:5: error: candidates are: virtual void A::f1()
prog.cpp:16: error:                 virtual void CPrime::f1()
prog.cpp:5: error:                 virtual void A::f1()
prog.cpp:12: error:                 virtual void C::f1()
...