Не получается скомпилить следующее:
class TestClass
{
public:
void Test(void)
{
}
};
int main()
{
TestClass obj;
boost::function<void(void)> func;
func = std::bind1st(std::mem_fun(&TestClass::Test), &obj);
func();
return 0;
}
Если меняю сигнатуру функции везде на void(int) то все нормально компилится, а в моем варианте ввыдает длинный списоб ошибок.
Компилятор Visual Studio 7.1.
Здравствуйте, newman2, Вы писали:
N>Не получается скомпилить следующее:
N>N>class TestClass
N>{
N>public:
N> void Test(void)
N> {
N> }
N>};
N>int main()
N>{
N> TestClass obj;
N> boost::function<void(void)> func;
N> func = std::bind1st(std::mem_fun(&TestClass::Test), &obj);
N> func();
N> return 0;
N>}
N>
N>Если меняю сигнатуру функции везде на void(int) то все нормально компилится, а в моем варианте ввыдает длинный списоб ошибок.
N>Компилятор Visual Studio 7.1.
Дело в том, что поскольку функция
Test без аргументов, автоматически используется версия
mem_fun, наследуемая от
binary_function, а
bind1st, как впрочем и
bind2nd хотят функтор, базовый класс которого —
unary_function.
Когда ты добавляешь
Test аргумент (например, int), используется версия
mem_fun, наследуемая от
unary_function, но ты будешь вынужден передавать недостающий аргумент при вызове результирующего функтора:
func(некоторый тип());
Вызод из положения, использовать
Boost:
func = boost::bind(std::mem_fun(&TestClass::Test), &obj);
func();
Здравствуйте, GregZ, Вы писали: ...
Спасибо, объяснил, почему не компилится.
Еще вопрос, а получится у меня сделать сравнение двух таких функторов?
class TestClass
{
public:
void Test(void)
{
}
};
int main()
{
TestClass obj;
boost::function<void(void)> func;
func = boost::bind(&TestClass::Test, &obj);
boost::function<void(void)> other_func;
other_func = boost::bind(&TestClass::Test, &obj);
if(func == other_func)
printf("Ok!\n");
return 0;
}
Компилятор пишет, что не может выбрать какой из операторов вызывать.