c++中没有从派生类调用基类方法的匹配函数
c++ no matching function for call to base-class method from derived-class
我有点困惑,因为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::service:: service ,它是由Services::UserService::UserService派生的。我做了另一个基类Lib::request:: request 派生自Services::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和services::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;
}
}
}
似乎您忘记在方法的声明体中放入void
。在类中声明方法的代码如下:
void registerMethod(string MethodName, FuncPtr Func);
那么你必须把void
放在声明体中。
void Services::UserService::UserService::registerMethod( ...
^^^^
所以我最终自己解决了它,感谢每个贡献者。没有感谢那些没有读我的问题,并认为他们必须评判我的努力的人。
但是,如果其他人遇到这个:
正如我在最初的帖子中所写的那样,这个电话是错误的。要工作,需要对目标函数指针进行reinterpret_cast。这适用于派生类。this->registerMethod("Login", reinterpret_cast<FuncPtr>(&UserService::Login));
相关文章:
- 使用子类覆盖基类中定义的函数
- 如何基于模板化类的基类专门化成员函数
- 永久更改派生类的基类?
- C++初始化之前派生类调用基类的方法
- 如何从派生类访问基类中的重载运算符?
- CRTP 如何使派生类具有基类的容器
- 如何删除派生类中基类对象的新对象
- 是否可以从派生类返回基类的实例?
- C ++中有没有办法让派生类重写基类静态方法
- C++多态性模板类:调用基类方法而不是派生类
- 从派生类实现基类构造函数专用化的替代方法是什么
- C++-从方法基类调用派生类中的重写方法
- 从基类调用基类中不存在的派生方法
- c++中没有从派生类调用基类方法的匹配函数
- C++派生类调用基类方法给出了分段错误
- 子类调用基类构造函数,然后使用子类Arduino c++中基类的实例方法
- 通过多级继承从模板子类调用基类的模板方法
- 如果派生类重写基类方法,为什么要调用基类方法
- 在c++中是否可以从派生类调用基类中的方法?
- 需要从c++中的派生类调用基类析构函数方法