gccがメッセージでエラーをドロップしたので、少し混乱しました
error: no matching function for call to ...
note: candidates are ...
そのため、間違った関数呼び出しを行ったようです。これが私がgccから実際に得たものです:
src/Services/UserService/UserService.cpp:17: error: no matching function for call to ‘Services::UserService::UserService::registerMethod(const char [6], Services::UserService::Request::LoginRequest* (Services::UserService::UserService::*)(std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Lib::request::Param, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Lib::request::Param> > >&))’
src/Services/UserService/../../Lib/Service/Service.hpp:47: note: candidates are: void Lib::service::Service::registerMethod(std::string, Lib::request::Request* (Lib::service::Service::*)(std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Lib::request::Param, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Lib::request::Param> > >&))
Services::UserService::UserServiceによって派生した基本クラスLib::service::Serviceを取得しました。そして、 Services::UserService::Request::LoginRequestから派生した別の基本クラスLib::request::Requestを作成しました
基本クラス Lib::service::Service は、文字列と関数ポインタを受け取る「registerMethod」というメソッドを実装します。
typedef Lib::request::Request* (Lib::service::Service::*FuncPtr)(map<string, Param>&);
...
void registerMethod(string MethodName, FuncPtr Func);
したがって、gcc 出力を少しフォーマットすると、次のようになります。
要求されるのは:
Services::UserService::UserService::registerMethod(
const char [6],
Services::UserService::Request::LoginRequest* (
Services::UserService::UserService::*
)(
std::map<
std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
Lib::request::Param,
std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Lib::request::Param> >
>&
)
)
そしてgccは、(そして唯一のもの - そして私が使いたいもの)の候補は次のとおりです:
void
Lib::service::Service::registerMethod(
std::string,
Lib::request::Request* (
Lib::service::Service::*
)(
std::map<
std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
Lib::request::Param,
std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Lib::request::Param> >
>&
)
)
したがって、Services::UserService::UserService は Lib::service::Service から派生し、Serices::UserService::Request::LoginRequest は Lib::request::Request から派生しているので、私が定義したようにこれは機能していると思いました関数を使用して基本クラスに一致させるため、それらを派生クラスでも使用できます。
ここでどこが間違っていますか?これが役立つ場合は、さらにコードを示します;-)
これまでありがとう!
よろしくお願いします、
セバスチャン
namespace Lib {
namespace service {
class Service;
}
}
namespace Lib {
namespace request {
class Request {
public:
Request(Lib::service::Service *Owner);
virtual ~Request();
virtual void Execute() = 0;
void join(Lib::Session::Session *session);
protected:
Lib::service::Service *module;
Lib::Session::Session *session;
map<string, Param> params;
private:
};
}
}
typedef Lib::request::Request* (Lib::service::Service::*FuncPtr)(map<string, Param>&);
namespace Lib {
namespace service {
class Service {
public:
const string Name;
Service();
virtual ~Service();
Request* Call(string MethodName, map<string, Param> &Params);
protected:
void registerMethod(string MethodName, FuncPtr Func);
private:
map<string, FuncPtr> methods;
};
}
}
-
namespace Lib
{
namespace service
{
Service::Service()
{
}
Service::~Service()
{
}
void Service::registerMethod(string MethodName, FuncPtr Func)
{
this->methods.insert(pair<string, FuncPtr>(MethodName, Func));
}
Request* Service::Call(string MethodName, map<string, Param> &Params)
{
FuncPtr Func;
Func = this->methods[MethodName];
Request *req = (*this.*Func)( Params );
return req;
}
}
}
-
namespace Services {
namespace UserService {
class UserService : public Lib::service::Service {
public:
const string Name;
UserService();
virtual ~UserService();
LoginRequest* Login(map<string, Param> ¶ms);
LogoutRequest* Logout(map<string, Param> ¶ms);
private:
};
}
}
-
namespace Services
{
namespace UserService
{
UserService::UserService() : Name("UserModule")
{
this->registerMethod("Login", &UserService::Login);
this->registerMethod("Logout", &UserService::Logout);
}
UserService::~UserService()
{
}
LoginRequest* UserService::Login(map<string, Param> ¶ms)
{
LoginRequest *request = new LoginRequest(this);
//...
return request;
}
LogoutRequest* UserService::Logout(map<string, Param> ¶ms)
{
LogoutRequest *request = new LogoutRequest(this);
//...
return request;
}
}
}