c++中没有从派生类调用基类方法的匹配函数

c++ no matching function for call to base-class method from derived-class

本文关键字:类方法 基类 函数 调用 派生 c++      更新时间:2023-10-16

我有点困惑,因为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> &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;
        }
    }
}

似乎您忘记在方法的声明体中放入void。在类中声明方法的代码如下:

void registerMethod(string MethodName, FuncPtr Func);

那么你必须把void放在声明体中。

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

所以我最终自己解决了它,感谢每个贡献者。没有感谢那些没有读我的问题,并认为他们必须评判我的努力的人。

但是,如果其他人遇到这个:

正如我在最初的帖子中所写的那样,这个电话是错误的。要工作,需要对目标函数指针进行reinterpret_cast。这适用于派生类。
this->registerMethod("Login", reinterpret_cast<FuncPtr>(&UserService::Login));