首先,這個問題純粹是理論性的。我不是在尋找解決方案(我已經知道了),我只是在尋找解釋。C++奇怪的模糊調用重載函數
下面的代碼不編譯:
struct foo {};
void a(foo) {}
namespace foobar {
void a(foo) {}
void b(foo f) {a(f);}
}
int main() {return 1;}
MSVC++:
1>c:\projects\codetests\main.cpp(7) : error C2668: 'foobar::a' : ambiguous call to overloaded function
1> c:\projects\codetests\main.cpp(4): could be 'void foobar::a(foo)'
1> c:\projects\codetests\main.cpp(2): or 'void a(foo)' [found using argument-dependent lookup]
1> while trying to match the argument list '(foo)'
G ++:
main.cpp: In function 'void foobar::b(foo)':
main.cpp:5:20: error: call of overloaded 'a(foo&)' is ambiguous
main.cpp:5:20: note: candidates are:
main.cpp:4:7: note: void foobar::a(foo)
main.cpp:2:6: note: void a(foo)
儘管此代碼編譯(MSVC++和G ++):
namespace bar {struct foo {};}
void a(bar::foo) {}
namespace foobar {
void a(bar::foo) {}
void b(bar::foo f) {a(f);}
}
int main() {return 1;}
這是爲什麼?這個編譯器的foo命名空間在這裏改變了什麼?這種行爲是在C++標準中定義的嗎?還有其他解釋嗎?謝謝。
第一種情況有兩種可能的匹配,導致錯誤。您在第二種情況下刪除了這兩種可能的匹配中的一種,消除了錯誤。什麼是神祕? –
乳清在第二種情況下是否刪除了一個可能的配對?還有:: a(bar :: foo)和foobar :: a(bar :: foo)。你看到了這個謎團? – florian