2012-04-19 42 views
5

這個問題讓我和一些同事感到困惑,但是我們已經證實這是對5種不同編譯器的錯誤。他們都回來說這個小代碼片段是「不明確的」。C++對不同命名空間中的函數的模糊調用

namespace foo { 
    struct type_t { 
    int x; 
    }; 
    void bar(type_t &); 
} 

void bar(foo::type_t &); 

void func(void) { 
    foo::type_t x = { 10 }; 
    bar(x); 
} 

鏘返回如下:

func.cpp:12:3: error: call to 'bar' is ambiguous 
    bar(x); 
    ^~~ 
func.cpp:5:8: note: candidate function 
    void bar(type_t &); 
    ^
func.cpp:8:6: note: candidate function 
void bar(foo::type_t &); 
    ^
1 error generated. 

這究竟是爲什麼?代碼中沒有「使用」語句。解析順序不應該包含foo命名空間,那麼它爲什麼在那裏搜索?爲什麼這是模糊的?

+5

閱讀[ADL](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup),也稱爲Koenig lookup。 – ildjarn 2012-04-19 19:21:33

+0

在gcc中:http://ideone.com/G4uHo – 2012-04-19 19:22:04

+0

這似乎不是一個編譯器錯誤。 g ++,HP C++和Comeau也會產生類似的錯誤。 – daxelrod 2012-04-19 19:22:58

回答

8

這是argument dependent lookupbar的參數位於foo名稱空間中,因此在該名稱空間中查找bar也會導致含糊不清。如果您想從全局名稱空間中調用foo,請撥打::foo

+0

是的,使用「descoping」運算符:':: bar()'來修復它:) – Gui13 2012-04-19 19:22:24

+0

@ Gui13謝謝,我只是補充說 – juanchopanza 2012-04-19 19:24:39