0

Учитывая следующий код, который я не могу скомпилировать.Вызов функции-члена из функции-члена templated argument

template < typename OT, typename KT, KT (OT::* KM)() const > 
    class X 
    { 
    public: 
     KT mfn(const OT & obj) 
     { 
      return obj.*(KM)(); // Error here. 
     } 
    }; 

    class O 
    { 
    public: 
     int func() const 
     { 
      return 3; 
     } 
    }; 

    int main(int c, char *v[]) 
    { 
     int a = 100; 

     X< O, int, &O::func > x; 

     O o; 

     std::cout << x.mfn(o) << std::endl; 
} 

Я получаю сообщение об ошибке феллинг

error: must use '.*' or '->*' to call pointer-to-member function in '&O::func (...)' 

Я думал, что я использовал. * Но я явно что-то не так.

Как я могу назвать функцию-член?

Я попытался

return obj.*(template KM)(); 
return obj.*template (KM)(); 
return obj.template *(KM)(); 

Ни один из них не работал.

+1

Указатель на функцию действительно страшные звери :( –

+0

Обратите внимание, что 'template' требуется только для зависимых шаблонов и' O :: func' не является функцией шаблона. –

ответ

5

Правильный синтаксис

return (obj.*KM)(); 
+0

Спасибо Гарет .. Я официально маппет :) Это был единственный, который я не пробовал. – ScaryAardvark

+0

Напоминаем, что указатель на функцию не является полным без объекта, на который он будет действовать (в конце концов, это необходимо). Если вы принимаете точку зрения функтора, это имеет смысл, по крайней мере, так я пытаюсь запомнить синтаксис ... и когда я не могу просто указать «указатель на C++ для google», и вот ссылка, которая всегда пришла сразу : http://www.newty.de/fpt/fpt.html :) –