Tôi gặp vấn đề này làm phiền tôi. Tôi có lớp FSM mà phím sư để callbacksChức năng như thông số mẫu phát hành
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;
};
Và một số lớp callbacks
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;
}
};
Bây giờ nếu vào chính tôi làm:
FSM aFSM;
// OK
aFSM.addCallback("one", &FSM::callback< CallbackBase, &CallbackBase::operator() >);
// KO
aFSM.addCallback("two", &FSM::callback< Callback, &Callback::operator() >);
Cuộc gọi đầu tiên là tốt, trong trình biên dịch thứ hai than phiền:
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’
Cũng lưu ý rằng những điều sau đây là tốt
typedef bool (Callback::*Function_t)(int);
Function_t aFunction = &Callback::operator();
(Callback().*aFunction)(5);
Bất kỳ ý tưởng nào? Cảm ơn trước sự giúp đỡ của bạn.
Simone
Dường như lỗi trình biên dịch. : | – Nawaz
Vâng tôi cũng nghĩ thế. Nó khá lạ – Simone
Tôi cũng có một số vấn đề với việc sử dụng các hàm cơ sở (hoặc các toán tử) với một con trỏ thành viên của lớp dẫn xuất. Trong MSVC atleast, nó chỉ không hoạt động trong các mẫu. – Xeo