2011-12-17 3 views
1

Я пытаюсь написать функтор, чтобы вызвать функцию boost с привязкой и некоторым шаблоном. Поэтому у меня есть это главное:Функция с шаблонами и boost

int  function(char c) 
{ 
    std::cout << c << std::endl; 
    return (0); 
} 

int main() 
{ 
    Function<int (char)> fb = boost::bind(&function, _1); 
    fb('c'); 
    return (0); 
} 

и это мой класс Function:

template<typename F> 
class Function 
{ 
private: 
    F  functor; 

public: 
    Function() 
    { 
     this->functor = NULL; 
    }; 

    Function(F func) 
    { 
     this->functor = func; 
    }; 

    template <typename P> 
    void operator()(P arg) 
    { 
     (*this->functor)(arg); 
    }; 

    void operator=(F func) 
    { 
     this->functor = func; 
    }; 
}; 

У меня есть проблема: когда я пытаюсь скомпилировать я эти ошибки:

error C2440: 'initializing' : cannot convert from 'boost::_bi::bind_t<R,F,L>' to 'Function<F>' 
IntelliSense: no suitable user-defined conversion from "boost::_bi::bind_t<int, int (*)(char), boost::_bi::list1<boost::arg<1>>>" to "Function<int (char)>" exists 

Кто-то может мне помочь?

+1

Подробнее о стиле Erasure в C++. Ваш класс не реализует его, тогда как 'boost :: function' и' std :: function' в C++ 11 реализуют его. Я бы рекомендовал вам прочитать эту статью: http://www.artima.com/cppsource/type_erasure.html – Nawaz

ответ

0

boost::bind вернет что-то неуказанное, но конвертируется в boost::function. У вас нет причин иметь свой собственный класс function.

Посмотрите на этом простом примере:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 

int func(char) { return 23; } 

int main() 
{ 
    boost::function<int(char)> bound = boost::bind(func, _1); 
    return 0; 
} 

Что это unspecified типа возвращаемого значения означает для вашего дела? Вам необходимо удалить тип Function и необходимо написать что-то по имени AnyFunction. Зачем? Потому что вы никогда не сможете описать тип аргумента шаблона Function в C++ 03 (и даже C++ 11, например, принимающий только определенный тип в качестве аргумента функции).

+0

boost :: function запрещена, потому что мне нужно написать класс, который работает с 'Function f = & function;' и 'Function fb = boost :: bind (& function, _1);' –

+0

Я не понимаю. Вы пишете 'Function <...>', но кто-то еще его использует? Почему бы просто не использовать 'boost :: function'? – pmr

+0

, потому что это упражнение, и это запрещено использовать –

Смежные вопросы