Неразрешенный внешний символ "public: void __thiscall ..." - PullRequest
0 голосов
/ 20 февраля 2010

Я использую 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 void функция, которая хранится в частном порядке в заголовке TitleState и определяется в файле реализации как простой вывод на консоль через std :: cout (просто для проверки работоспособности).

В моем коде, если мышь нажимает кнопку в функции HandleEvents TitleState, программа вызывает функцию 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 или объявлено правильно. Любая помощь приветствуется. Спасибо.

P.S. Когда я использовал установщик BoostPro, я устанавливал только однопоточные компоненты, но не многопоточные. Может ли это быть причиной, почему это не работает? Я читал, что проблемы компоновщика могут возникать, когда библиотеки связываются по-разному. Если это может быть проблемой, я добавлю, что я также использую библиотеку SFML.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2010

Добавить опцию библиотеки, когда вы связываете свою программу:

г ++:

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

VC ++:

0 голосов
/ 20 февраля 2010

Я не уверен, в чем проблема. Все включено или объявлено правильно. Любая помощь приветствуется. Благодаря.

Это просто означает, что компилятор находит объявление. Но компоновщик должен найти определения символов. (См. этот ТАК вопрос о том, в чем разница между объявлением и определением.) Вам необходимо предоставить его с библиотекой. Если вы используете GCC, следуйте совету Фонга .

...