Ambiguous call to overloaded function
先看看我们的测试程序:
$ cat -n namespace.cpp
1
2 #include <cassert>
3 #include <cstdio>
4 #include <cstdlib>
5
6 /* Here is our namespace Foo */
7 namespace Foo
8 {
9 void sub(void)
10 {
11 printf("Foo::sub()\n");
12 }
13 }
14
15 /* sub() is in global namespace. */
16 void sub(void)
17 {
18 printf("global sub()\n");
19 }
20
21 int main(int argc, char *argv[])
22 {
23 /* calls sub() in global namespace. */
24 sub();
25 /* calls sub() in namespace Foo. */
26 Foo::sub();
27
28 /* change search path to global and Foo. */
29 using namespace Foo;
30
31 /* compiler cannot determine which sub() to be called. */
32 // expect error
33 // sub();
34 //
35
36 /* tell the compiler which one to use. */
37 ::sub();
38 Foo::sub();
39
40 return 0;
41 }
42
D:\> version
Microsoft Windows Server 2003, Enterprise Edition Service Pack 1 (Build 3790)
D:\> cl /DWIN32 namespace.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
namespace.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:namespace.exe
namespace.obj
D:\> namespace
global sub()
Foo::sub()
global sub()
Foo::sub()
$ uname -a
CYGWIN_NT-5.2 uniware 1.5.5(0.94/3/2) 2003-09-20 16:31 i686 unknown unknown Cygwin
$ gcc --version
gcc (GCC) 3.3.1 (cygming special)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -Wall -o namespace namespace.cpp
$ ./namespace
global sub()
Foo::sub()
global sub()
Foo::sub()
结果和VC++的一致。如果把第33行的注释去掉,则:
D:\> cl /DWIN32 namespace.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
namespace.cpp
namespace.cpp(33) : error C2668: 'sub' : ambiguous call to overloaded function
$ gcc -Wall namespace.cpp
namespace.cpp: In function `int main(int, char**)':
namespace.cpp:33: error: call of overloaded `sub()' is ambiguous
namespace.cpp:17: error: candidates are: void sub()
namespace.cpp:10: error: void Foo::sub()
GCC编译的结果和VC++的类似,不过GCC的提示信息更加准确,也有助于定位问题。
人总是会犯错误的,微软的工程师也不例外,这里就是Visual C++ 6.0中的类似错误。