вызов функтора с использованием функции Object tr1::function‹›

Я пытаюсь реализовать пример кода книги Скотта Майера, пример касается вызова функтора через объект функции.

заголовочный файл gameCharachter.h

#ifndef GAMECHARACTER_H
#define GAMECHARACTER_H

#include <iostream>
#include <typeinfo>
using namespace std;
#include <tr1/functional>

class GameCharacter;

int defaultHealthCalc(const GameCharacter& gc);

class GameCharacter
{

public:

    typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;

    explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)

        : healthFunc(hcf)
    {
    }

    ~GameCharacter()
    {
    }

    int healthValue() const
    {
        return healthFunc(*this);
    }
private:

    HealthCalcFunc healthFunc;

};

class EyeCandyCharacter:   public GameCharacter    // another character
{

public:

    explicit EyeCandyCharacter(HealthCalcFunc hcf = defaultHealthCalc)

        : GameCharacter(hcf)
    {
        cout<<typeid(*this).name()<<"::"<<__FUNCTION__<<""<<endl;

    }                                           

};   

struct HealthCalculator                          
{
    /*explicit*/ HealthCalculator()
    {

    }

    int operator()(const GameCharacter& gc) const     // calculation function
    {
        cout<<typeid(*this).name()<<"::"<<__FUNCTION__<<""<<endl;
           return 0;
    }                                        

};

#endif // GAMECHARACTER_H

main.cpp:

#include "gamecharacter.h"

int main()
{
    EyeCandyCharacter ecc1(HealthCalculator());       
    ecc1.healthValue();
}

почему объект function‹> отказывается вызывать функцию operator() в healthvalue()


person freesyria    schedule 27.02.2015    source источник
comment
Почему вы говорите, что он отказывается это делать?   -  person jpo38    schedule 27.02.2015
comment
Самый неприятный разбор. Снова.   -  person T.C.    schedule 27.02.2015
comment
Пожалуйста, добавьте компилятор, который вы используете. Некоторые проблемы зависят от компилятора.   -  person Martin Schlott    schedule 27.02.2015
comment
Мой компилятор Mingw   -  person freesyria    schedule 27.02.2015
comment
Это в конечном итоге также приводит к самому неприятному синтаксическому анализу, но объясняет вашу проблему, после чего вы можете перейти к наиболее неприятному синтаксическому анализу: stackoverflow.com/questions/8903082/   -  person haavee    schedule 27.02.2015


Ответы (2)


EyeCandyCharacter ecc1(HealthCalculator());

объявляет функцию с именем ecc1, которая принимает аргумент типа «указатель на функцию, не принимающую аргументов и возвращающую HealthCalculator», и возвращает EyeCandyCharacter. Я предполагаю, что это не является вашим намерением.

person T.C.    schedule 27.02.2015
comment
Я просто пытаюсь реализовать пример учебника - person freesyria; 27.02.2015
comment
ecc1 является объектом типа EyeCandyCharacter, и аргумент, который он принимает, также является объектом типа HealthCalculator. - person freesyria; 28.02.2015

это правильный вызов, он должен вызываться привязкой

#include "gamecharacter.h"

int main()
{
    HealthCalculator hc;
    EyeCandyCharacter ecc1(std::tr1::bind(&HealthCalculator::operator(),hc,tr1::placeholders::_1));
    ecc1.healthValue();
}
person freesyria    schedule 28.02.2015