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

标签 c++ derived-class base-class pointer-to-member

我有点困惑,因为 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 outbut 有点给了我这个:

要求是:

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;
        }

    }
}

最佳答案

您似乎忘记在方法的声明主体中放置一个void。您有以下代码,在类中声明方法:

void registerMethod(string MethodName, FuncPtr Func);

然后你必须把 void 放在声明主体中。

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

关于c++没有匹配函数用于从派生类调用基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15720539/

相关文章:

grails - Grails Controller 可以从基类扩展吗?如何让 grails 不会爆炸?

c++ - 如何将结构中的字段添加到数组?

c++ - 方法参数中的动态类型匹配

c++ - 使用派生类中的成员在父类中初始化 std::function

c++ - 从基类派生函数

C# 私有(private)(隐藏)基类

c++ - 结构保持值

c++ - 在 C++ 中创建库

c++ - 为什么 GCC 和 Clang 不做这种别名优化?

c# - 基类中的 NUnit TestCaseSource 具有来自派生类的数据