2

假设我在其中一个头文件中声明了一个名为“ void f(int x) ”的函数(在 c++ 中,VS 2010 中),然后在相应的 cpp 文件中实现了它。在尝试仅在该源文件中添加重载函数(void f(int x, int y))时(标题中没有声明),我收到错误“函数不接受 2 个参数”。
(这个函数写在调用函数的上面)。

头文件没有任何实现的代码。

我是否违反了一些 c++ 规则,或者仅仅是因为使用了 Visual?我必须在头文件中声明所有重载函数(或根本不声明)吗?

编辑:源文件:

int findNodeRec(int data, NodeTree *root) 
{ 
    return 1;
}
int Tree::findNodeRec(int data) 
{ 
    return findNodeRec(data, m_root); 
} 
4

1 回答 1

7

问题是一个参数版本被定义为一个类成员,而两个参数版本是一个自由函数。当编译器试图找到要调用的候选对象时,它不会混合不同的范围,因此它只会看到类范围版本,然后尝试根据参数选择最佳重载。

只需调用::f(x, y)它,它就会在全局范围内查找 free 函数。请注意,是否在标头中声明了自由函数并不重要。编译器仍然找不到它。

于 2013-01-07T21:55:35.857 回答