ошибка в: шаблонной функции c ++ - PullRequest
1 голос
/ 24 марта 2011

Привет, я пытаюсь построить тамплатную функцию в vc ++, как показано ниже:

template<class _Fn0,class _Fn1>   void for_each(_Fn0 _Func0,_Fn1 _Func1)
{    
    _Func0(12);
    _Func1(12);

}

когда я использую для _Func0 / 1 глобальную функцию, эта работа выполняется быстро.

void aglobal(int a)
{
    a++;
}
for_each(aglobal,aglobal);

но когда я использую функцию класса memeber, я получаю сообщение об ошибке.

class A
{
public:
    void aa(int a)
    {
        a++;
    }
    void bb(int b)
    {
        b++;
    }
    void cc()
    {
        for_each(&A::aa,&A::bb);
    }
};

ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент 1> см. Ссылку на экземпляр шаблона функции 'void for_each (_Fn0, _Fn1)', который компилируется.

Как я могу исправить эту ошибку?

спасибо, Герцль.

Ответы [ 2 ]

9 голосов
/ 24 марта 2011

A::aa и A::bb - нестатические функции-члены;Вы пытаетесь вызывать их так, как если бы они были функциями, не являющимися членами.

Нестатическая функция-член может быть вызвана только для экземпляра объекта.

Чтобы исправить это, вы можете

  1. сделать aa и bb статическими или

  2. передать экземплярA в for_each, чтобы он мог вызывать функции в этом экземпляре, или

  3. используйте std::bind / std::tr1::bind / boost::bind, чтобы привязать функцию-член кэкземпляр перед передачей его в шаблон функции или

  4. написать функтор, который хранит указатель на экземпляр A, для которого вы хотите вызвать функцию-член, и указатель нафункция-член, которую вы хотите вызвать;фактически это то, что делает bind (хотя bind гораздо более универсально).

1 голос
/ 24 марта 2011

Функция-член класса всегда принимает дополнительный указатель param «this», поэтому вы можете сделать его статическим, чтобы попробовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...