我目前正在使用C/C++进行一些套接字编程.为了能够使用更简洁的界面和更多的OO结构,我决定围绕C套接字API的部分编写一些简单的包装类,但在这样做时我偶然发现了一个问题:
给出以下代码:
// Global method int foo(int x) { return x; } // Class that calls the global method class FooBar { public: void foo() { return; }; void baz() { foo(1); } };
g ++给出以下错误消息:
test.cpp: In member function ‘void FooBar::baz()’: test.cpp:10: error: no matching function for call to ‘FooBar::foo(int)’ test.cpp:9: note: candidates are: void FooBar::foo()
重命名类方法可以解决问题.
为什么即使方法签名不同,也存在某种命名冲突?解决这个问题的最佳方法是什么?
谢谢/ Erik
问题是它首先查看你的类的范围,并找到一个foo函数.然后查找将停止,编译器尝试匹配参数.由于它只在您的类中具有该范围内的一个foo函数,因此调用该函数失败.
您需要明确声明要调用自由函数:
::foo(1);
另一个解决方案是在baz中声明函数:
void baz() { int foo(int); foo(1); }
假定定义foo函数的范围是类的周围命名空间.