c ++ нет соответствующей функции для вызова метода базового класса из производного класса

Я немного запутался, когда 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> > >&))

Я получил базовый класс Lib :: сервис :: Услуги который получен Услуги :: UserService :: UserService.
И я сделал еще один базовый класс Lib :: Запрос :: Request который получен Услуги :: UserService :: Request :: LoginRequest

Базовый класс 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> &params);
LogoutRequest* Logout(map<string, Param> &params);
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> &params)
{
LoginRequest *request = new LoginRequest(this);

//...

return request;
}

LogoutRequest* UserService::Logout(map<string, Param> &params)
{
LogoutRequest *request = new LogoutRequest(this);

//...

return request;
}

}
}

0

Решение

Кажется, вы забыли поставить void в объявлении основной части метода. У вас есть код ниже, объявив метод в классе:

void registerMethod(string MethodName, FuncPtr Func);

Тогда вы должны поставить void в объявлении тела.

void Services::UserService::UserService::registerMethod( ...
^^^^
1

Другие решения

Так что я наконец решил это сам, спасибо за каждого участника. Нет, спасибо тем людям, которые не читали мой вопрос и думали, что должны судить о моих усилиях.

Однако, если кто-то еще столкнется с этим:

Это было совсем, как я написал в своем первоначальном посте, звонок был неправильным. Для работы необходимо выполнить reinterpret_cast с указателем целевой функции. Это работает для производных классов.

this->registerMethod("Login", reinterpret_cast<FuncPtr>(&UserService::Login));
0

По вопросам рекламы [email protected]