0

我正在使用boost::function将函数传递给Button构造函数,以便它保存该函数。每当它被激活时调用它。

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

在我的 TitleState 中,我构建了一个像这样的 Button。

  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 简单地输出到控制台(仅作为测试它是否工作)。

在我的代码中,如果鼠标单击 TitleStateHandleEvents函数中的按钮,程序会调用该按钮的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++ -L/your/library/path -lyour_library_name

vc++:

于 2010-02-20T14:31:59.063 回答
0

我不确定问题是什么。一切都#included 或正确声明。任何帮助表示赞赏。谢谢。

这只是意味着编译器找到了声明。但是链接器必须找到符号的定义。(有关声明和定义之间的区别,请参阅SO 问题。)您需要将其与库一起提供。如果您使用 GCC,请遵循Phong 的建议

于 2010-02-20T14:35:42.353 回答