为什么会发出两次错误?

3

我知道我所问的问题超出了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

你正在使用哪个版本的G++?

有趣的是,在MacOS X 10.6.4上,使用苹果的G++ 4.2.1编译您展示的代码,我得到了双倍的错误信息。

使用我自己构建的G++ 4.5.1,我只收到一个警告。

看起来这是一个已经修复的bug。


在版本4.2.1和4.5.1之间,源代码中“reference to %s is ambiguous”附近发生了什么变化,导致影响到了g++? - Thomas L Holaday

0

我的第一个猜测是每个歧义对应一个错误:

#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()

0

即使使用了该开关,g++ 4.2.1仍会重复显示错误信息。 - Thomas L Holaday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接