2017-02-14 4 views
0

Я использую шаблон в своей программе, который вызывает вызов различных видов функторов в зависимости от типа объекта. В приведенном ниже коде объект b1 явно создается с производным функтором типа FunctorX. Но когда я делаю вызов в коде, базовый функтор вызывается вместо производного функтора. Почему это?Производный функтор, не вызываемый при передаче в качестве параметра шаблона

struct Functor 
{ 
    Functor() {} 
    ~Functor() {} 

    virtual int operator()() { return 33; } 
}; 

struct FunctorX : public Functor 
{ 
    FunctorX() : Functor() {} 
    ~FunctorX() {} 

    int operator()() { return 44; } 
}; 

template< typename FunctorT > 
struct B 
{ 
    B(FunctorT FunctorArg) : Functor { FunctorArg } {} 
    ~B() {} 

    FunctorT Functor; 
}; 

int main() 
{ 
    B<Functor> b1 { FunctorX() }; // initialize with derived functor. Derived functor gets instantiated. 
    int num = b1.Functor(); // error: calls base functor, not derived functor 

    return 0; 
} 
+0

@Barry меняет функтор члена B на ptr, позволяет мне делать 'B < Functor > b1 {new FunctorX()};' и исправлять нарезку. Но как бы тогда был вызов на «b1»? Я продолжаю получать 'error C2064: термин не вычисляет функцию, принимающую 0 аргументов, когда я вызываю' b1.Functor(); '. – rtischer8277

+0

@Barry Я получил его: 'int num = (* b1.Functor)();' – rtischer8277

ответ

0

B<Functor> удерживает объект типа Functor. Вы можете инициализировать этот объект с объектом типа FunctorX, но при его сохранении объект будет нарезать до Functor. Точно так же, как unsigned int i = std::numeric_limits<unsigned long long>::max(), где хранимое значение имеет тип unsigned int, хотя оно инициализируется значением, тип которого равен unsigned long long.

+0

Это не пример среза. – Barry

+0

@Barry - это пример того, что он говорит: «хранимое значение имеет тип« int », хотя оно инициализируется значением, тип которого« unsigned long long ». И это основная проблема, связанная с нарезкой. –

+0

Сужение конверсий и нарезки - это разные вещи. – Barry

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