Проблема при компиляции с boost::function<void(void)>
От: newman2 Украина  
Дата: 11.10.05 11:32
Оценка:
Не получается скомпилить следующее:

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.
Re: Проблема при компиляции с boost::function<void(void)>
От: GregZ СССР  
Дата: 11.10.05 12:39
Оценка:
Здравствуйте, 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();
Re[2]: Проблема при компиляции с boost::function<void(void)>
От: newman2 Украина  
Дата: 11.10.05 13:07
Оценка:
Здравствуйте, 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;
}


Компилятор пишет, что не может выбрать какой из операторов вызывать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.