链接静态类和友元函数时出现奇怪的错误

时间:2012-09-21 13:21:53

标签: c++ linker static-libraries friend

我的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 ;
};

2 个答案:

答案 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();
}

???