2010-02-20 2 views
0

Я использую boost::function, чтобы включить передачу функции в конструктор Button, чтобы он удерживал эту функцию. Вызов его всякий раз, когда он активирован.неразрешенный внешний символ «public: void __thiscall ...»

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, определённый в файле реализации, просто выводит на консоль с помощью станд :: соиЬ (так же, как испытание для того, что он работает).

В моем коде, если мышь нажимает кнопку в функции 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)" ([email protected]@@QAEXXZ) referenced in function "public: virtual void __thiscall TitleState::HandleEvents(void)" ([email protected]@@UAEXXZ)

Я не уверен, что проблема в том, кроме того, что компоновщик может» t найти определение функции. Все - #included или объявлено правильно. Любая помощь приветствуется. Благодарю.

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

ответ

2

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

г ++:

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

VC++:

+0

Это не проблема. Библиотеки связаны. – Person

+1

Нет, это не так. Если бы они были, линкер лежал бы. И линкеры этого не делают. – sbi

+0

В свойствах проекта, в разделе Linker, в дополнительных каталогах библиотек, я добавил C: \ boost_1_42 \ lib Это была вся необходимая документация, которая требовалась при связывании с использованием VC++. – Person

0

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

Это означает, что компилятор находит декларацию. Но компоновщик должен найти определения символов. (См. this Вопрос о том, какая разница между объявлением и определением.) Вам нужно предоставить его библиотеке. Если вы используете GCC, следуйте Phong's advice.

+0

Я, вероятно, должен был добавить, я понимаю, что компоновщик не может найти определение, но я не знаю почему. Четко изложено определение. Я не использую GCC. – Person

+0

Какой у вас компилятор? – Phong

+0

Я использую VC++. – Person