0

関数をコンストラクターboost::functionに渡して、その関数を保持できるようにするために使用しています。Buttonそれがアクティブ化されるたびにそれを呼び出します。

typedef boost::function< void() > Action;

TitleStateで、このようなボタンを作成しました。

  m_play( 
    ButtonAction, // This is where I pass a function to Button's Action argument
    sf::Vector2f( 500, 400 ), 
    sf::IntRect( 500, 400, 700, 500 ) 
  )

ここで、ButtonActionは、static voidTitleStateのヘッダーに非公開で保持されている関数であり、実装ファイルでstd :: coutを介してコンソールに出力するだけであると定義されています(動作しているかどうかのテストとして)。

私のコードでは、TitleStateのHandleEvents関数でマウスがボタンをクリックすると、プログラムはそのボタンのActivate関数を次のように呼び出します。

void Button::Activate() const {
  m_action(); // m_action is the Action member that holds the ButtonAction I passed earlier
}

問題は、プログラムがリンクしようとすると、このエラーが発生することです。

unresolved external symbol "public: void __thiscall Button::Activate(void)" (?Activate@Button@@QAEXXZ) referenced in function "public: virtual void __thiscall TitleState::HandleEvents(void)" (?HandleEvents@TitleState@@UAEXXZ)

リンカが関数の定義を見つけられないこと以外に、何が問題なのかわかりません。すべてが#included適切に宣言されているか、宣言されています。どんな援助も大歓迎です。ありがとう。

PS BoostProインストーラーを使用したとき、私はシングルスレッドのものだけをインストールし、マルチスレッドのものはインストールしませんでした。これが機能しない理由でしょうか?ライブラリがさまざまな方法でリンクしている場合、リンカーの問題が発生する可能性があることを読みました。これが問題になる可能性がある場合は、SFMLライブラリも使用していることを追加します。

4

2 に答える 2

2

プログラムをリンクするときにライブラリオプションを追加します。

g ++:

g++ -L/your/library/path -lyour_library_name

vc ++:

于 2010-02-20T14:31:59.063 に答える
0

何が問題なのかわかりません。すべてが#includeされるか、適切に宣言されます。どんな援助も大歓迎です。ありがとう。

これは、コンパイラが宣言を見つけることを意味します。ただし、リンカはシンボルの定義を見つける必要があります。(宣言と定義の違いについては、このSOの質問を参照してください。)ライブラリを提供する必要があります。GCCを使用している場合は、Phongのアドバイスに従ってください。

于 2010-02-20T14:35:42.353 に答える