2010-08-20 60 views
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() 

回答

2

其中G ++的版本您使用的?

有趣的是,使用Apple的G ++ 4.2.1編譯你在MacOS X 10.6.4上顯示的代碼,我得到了雙重錯誤信息。

用我自己構建的G ++ 4.5.1,我只得到一個警告。

它看起來像有一個錯誤已被修復。

+0

GCC版本4.3.4 – Chubsdad 2010-08-20 04:16:03

+0

版本4.2.1和4.5.1之間的字符串「對%s的引用不明確」的字符串附近發生了哪些變化? – 2010-08-20 04:17:31

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