2013-03-30 19 views
0
派生類

我有點困惑,因爲GCC與消息C++因爲沒有匹配的函數調用基類的方法從

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> > >&)) 

我有一個基類庫::服務::服務服務:: UserService :: UserService的。 我做了另外一個基類庫::支持::請求這是由服務:: UserService ::支持:: LoginRequest

的基類庫::衍生服務::服務實現了一個調用的方法「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 0123派生的和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 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

這只是太多的代碼。你能不能創建一個小例子來展示你的問題?在您完成一個小例子時,您可能會發現問題的根本原因。 –

+0

我不會穿過所有的代碼。錯誤消息告訴你什麼是錯的。標有「不匹配呼叫...」的部分告訴你呼叫代碼在做什麼。標有「候選人是......」的部分告訴你看到了哪些重載。它無法在它們之間進行選擇。 –

+0

@PeteBecker:這就是所謂的SO聲望點的問題。缺乏任何努力的問題仍然會得到解答。希望每個問題都有一個凍結計量器。只有符合一些基本標準(*努力或清晰度*),Q才能被回答。除非提問者修改足夠制定基本標準,Q無法回答,一旦完成就解凍解凍。 –

回答

0

所以我終於自己解決了,謝謝你的貢獻者。不要感謝那些沒有讀過我的Q並認爲他們必須判斷我的努力的人。

但是,如果別人遇到這樣的:

這是相當正如我在最初的帖子中寫道,電話是錯誤的。爲了工作,需要對目標函數指針執行reinterpret_cast。這適用於派生類。

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

看來你忘了把一個void在聲明方法的身體。你有下面的代碼,在類中聲明方法:

void registerMethod(string MethodName, FuncPtr Func); 

然後你必須把void聲明爲正文。

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

+1我認爲這是問題所在。 – 0x499602D2

+0

該方法永遠不會超載。它調用(並應該這樣做!)前面有void的基類方法 - \t \t void Service :: registerMethod(string MethodName,FuncPtr Func){...} - 我將該類定義放到主文章中,澄清這一點 –