1

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 とそのメソッドを問題なく使用できるため、奇妙です。

私は何を間違っていますか?理解するのに2時間費やしましたが、本当に理解できません!!!

解決策:答えのアドバイスに従ってください:

// 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 ;
};
4

2 に答える 2

2

これはリンカ エラーではなく、コンパイラ エラーです。fooコンパイラは、定義または宣言がないため、function を呼び出す方法がわからないことを通知しています。

関数をフレンドとして宣言しても、適切な宣言に代わるものではありません。友達というときは、範囲内にfooも紹介しません。fooある意味では、友好宣言は、外部からは見えないクラスのプライベートな詳細です。

C++ で関数を使用するには、最初に宣言する必要があります。これは通常、実装ファイルに対応するヘッダー ファイルを介して行われますが、次のように簡単に行うことができます。

void foo();

fooが と同じファイルで定義されている場合は、問題を解決するために先に進むmainことができます(最初に使用する前に関数定義を確認しても、コンパイラでは問題ありません)。foomain

于 2012-09-21T13:27:05.217 に答える
0

それを使用する前に宣言fooしましたか:

#include "header_where_foo_is_declared.h"
int main()
{
   foo();
}

また

void foo();
int main()
{
   foo();
}

???

于 2012-09-21T13:26:15.383 に答える