我有这个问题困扰着我。我有FSM类关联键回调作为模板参数的问题
class FSM
{
public:
typedef bool (FSM::*InCallback_t)(int);
typedef std::map< std::string, InCallback_t > Table;
// Since I would like to allow the user to register both functors and class member functions
template< typename Callback_t, bool (Callback_t::*CallbackFunct_t)(int) >
bool callback(int x)
{
return (Callback_t().*CallbackFunct_t)(x);
}
void addCallback(const std::string& iKey, InCallback_t iCallback)
{
_table.insert(std::make_pair(iKey, iCallback));
}
[ ... ]
private:
Table _table;
};
还有一些回调类
class CallbackBase
{
public:
bool operator()(int x){ return doCall(x); }
private:
virtual bool doCall(int x){ return true; }
};
class Callback: public CallbackBase
{
private:
bool doCall(int x)
{
std::cout << "Callback\n";
return true;
}
};
现在如果到主我做的:
FSM aFSM;
// OK
aFSM.addCallback("one", &FSM::callback< CallbackBase, &CallbackBase::operator() >);
// KO
aFSM.addCallback("two", &FSM::callback< Callback, &Callback::operator() >);
第一个电话是好的,在第二个编译器抱怨:
Test.cpp: In function ‘int main(int, char**)’:
Test.cpp:104:77: error: no matching function for call to ‘FSM::addCallback(const char [4], <unresolved overloaded function type>)’
Test.cpp:104:77: note: candidate is:
Test.cpp:24:7: note: void FSM::addCallback(const string&, FSM::InCallback_t)
Test.cpp:24:7: note: no known conversion for argument 2 from ‘<unresolved overloaded function type>’ to ‘FSM::InCallback_t’
还要注意,以下是罚款
typedef bool (Callback::*Function_t)(int);
Function_t aFunction = &Callback::operator();
(Callback().*aFunction)(5);
任何想法? 在此先感谢您的帮助。
Simone
看起来像一个编译器错误。 :| – Nawaz
是的,我也是。这很奇怪 – Simone
我也遇到了一些问题,使用基类函数(或运算符)和派生类的成员函数指针。在MSVC atleast中,它只是在模板中不起作用。 – Xeo