Я знаю, что есть много других подобных вопросов, но ни один из тех, на которые я смотрел, похоже, не относится к тому, что я делаю. Суть того, что у меня есть:
template <typename T>
void CallFn(T *p, void (T::*pfn)(void))
{
(p->*pfn)();
}
вызывается с помощью:
class Foo
{
public:
void Bar(void);
}
...
Foo *p = ...
CallFn(p, &Foo::Bar);
но это дает мне ошибку, говорящую, что компилятор не может вывести аргументы шаблона для указателя на функцию-член. Если вместо этого я использую такую структуру:
template <typename T>
class Wrapper
{
public:
void operator()(T *p, void (T::*pfn)(void))
{
(p->*pfn)();
}
};
...
Foo *p = ...
Wrapper<Foo> x;
x(p, &Foo::Bar);
это работает, но синтаксис намного ужаснее. Мне просто интересно, почему компилятор может вывести тип функции-члена для класса, но не для функции.
CallFn<Foo>(p, &Foo::Bar);
? - person K-ballo   schedule 19.06.2013error C2784: 'void CallFn(T ^,void (__thiscall T::* )(void))' : could not deduce template argument for 'void (__thiscall T::* )(void)' from 'void (__cdecl Foo::* )(void)'
- person Duncan   schedule 19.06.2013__thiscall
(что правильно для функций-членов), а аргумент имеет__cdecl
, который обычно используется для свободных/статических функций. Вы явно отмечаете функцию-член как__cdecl
? - person Xeo   schedule 19.06.2013__cdecl
, и он все равно не удастся, но будет иметь__cdecl
в качестве соглашения о вызовах для обоих указателей функций. - person Duncan   schedule 19.06.2013