我的C ++代码遇到了很多麻烦,但我无法理解为什么。
我正在开发一个包含myclass.h和myclass.cpp的静态库libmylib.a。
我遇到的问题是这样的:
// myclass.h
class myClass{
public:
myclass();
myclass(a,b);
// some methods.
private:
int a ;
int b ;
};
在myclass.cpp中我定义了构造函数方法等等,一切正常: 我可以在main.cpp代码中使用该库。
然后我添加了一个朋友功能:
// myclass.h
class myClass{
public:
myclass();
myclass(a,b);
friend void foo() ;
// some methods.
private:
int a ;
int b ;
};
我在myclass.cpp中定义了foo函数,就像这个
一样// myclass.cpp
void foo(){
cout << "In foo function " ;
}
问题是,如果我尝试在main.cpp中使用foo(),我会收到一个编译错误,指出:
//main.cpp
#include "myclass.h" // foo() is declared here!
foo() ;
main.cpp:62:6:错误:'foo'未在此范围内声明
现在我真的无法理解问题所在。 我注意到在添加友元函数后,似乎链接器不再使用mylib,但我无法理解为什么。而且很奇怪,因为如果我在main.cpp myclass中评论foo(),它的方法可以毫无问题地使用。
我做错了什么?我花了两个小时试图搞清楚,但真的无法理解!!!
解决方案:遵循答案中的建议:
// myclass.h
void foo() ; // the function has to be declared outside the class
class myClass{
public:
myclass();
myclass(a,b);
friend void foo() ; // but here you have to specify that
// is a friend of the class!
// some methods.
private:
int a ;
int b ;
};
答案 0 :(得分:2)
这不是链接器错误,而是编译器错误。编译器告诉你它不知道如何调用函数foo
,因为它缺少定义或声明。
将某个函数声明为朋友并不能代替正确的声明。当您说foo
是朋友时,您也不会将foo
引入范围。从某种意义上说,友谊宣言是你班上隐藏的私人细节。
要在C ++中使用函数,您需要先声明它。这通常通过与实现文件对应的头文件来完成,但您可以这样做:
void foo();
如果在与foo
相同的文件中定义了main
,您可以在foo
之前移动main
来解决问题(在第一次之前看到函数定义)使用编译器就可以了。
答案 1 :(得分:0)
您在使用之前是否声明了foo
:
#include "header_where_foo_is_declared.h"
int main()
{
foo();
}
或
void foo();
int main()
{
foo();
}
???