簡體   English   中英

如何在c ++中使用返回類型std :: map導出函數

[英]How to export function with return type std::map in c++

我在Visual c ++中有一個DLL項目和一個CLR項目。

DLL項目是導出std :: map類型函數的項目。 我將從我的CLR項目中調用該函數。

來自DLL項目,staff.h

#ifdef STAFFS_EXPORTS
#define STAFFS_API __declspec(dllexport)
#else
#define STAFFS_API __declspec(dllimport)
#endif

#include <string>
#include <map>

namespace Staffs {
    // other exported functions
    ....
    //
    extern "C" STAFFS_API auto GetStaffMap() -> std::map<int, std::string>;
} 

staff.cpp

namespace Staffs {
   std::map<int, std::string> staffMap;

   extern "C" auto GetStaffMap() -> std::map<int, std::string> {
        return staffMap;
    }

   void display_json(json::value const & jvalue, utility::string_t const & prefix)
    {
      // some code being skipped here
      .......
      //
      staffMap.insert(std::make_pair(key, value));
    }
}

但是當我嘗試編譯我的DLL項目時,我遇到了一些錯誤:

Error   C2526   'GetStaffMap': C linkage function cannot return C++ class 'std::map<int,std::string,std::less<int>,std::allocator<std::pair<const _Kty,_Ty>>>'  AmsCppRest  c:\users\laptop-attendance\source\repos\amscpprest\amscpprest\staff.h   18  

Error   C2556   'std::map<int,std::string,std::less<int>,std::allocator<std::pair<const _Kty,_Ty>>> Staffs::GetStaffMap(void)': overloaded function differs only by return type from 'void Staffs::GetStaffMap(void)'   AmsCppRest  c:\users\laptop-attendance\source\repos\amscpprest\amscpprest\staff.cpp 38  

Error   C2371   'Staffs::GetStaffMap': redefinition; different basic types  AmsCppRest  c:\users\laptop-attendance\source\repos\amscpprest\amscpprest\staff.cpp 38  

我找不到與此問題相關的任何解決方案。

您無法使用C鏈接導出非平凡的C ++類,並且編譯器會在錯誤消息中告訴您。

問題是為什么你首先使用C鏈接? 如果您不必使用C鏈接,請不要使用它。 這將使事情變得更加復雜,因為您需要幾乎所有東西的包裝器。 只要您使用相同的編譯器就可以了。

所以在你的頭文件源文件中,如果可以的話,從簽名中刪除extern "C" (在任何一種情況下:從源文件中刪除它,否則你重新定義那里導致后兩個錯誤的函數)。

如果你不能刪除extern "C"部分,嘗試返回一個void指針( void* )而不是std::map並將其轉換為CLR項目中的map指針。 但這會迫使您使用托管C ++作為CLR語言。

我不知道您的CLR項目是什么,但如果它是用托管C ++編寫的,那么您可以使用所有標准C ++類型,因此C ++鏈接非常好。 如果您的CLR項目使用不同的語言(如C#),請考慮在托管C ++中創建另一個項目,並將其用作C# dll <--> managed C++ dll <--> C++ dll類的包裝器。

我對這類問題沒有經驗,但是如何創建一個類似的函數:

extern "C" STAFFS_API const char* GetStaffMapValue(int key);

extern "C" const char* GetStaffMapValue(int key) {
   auto it = staffMap.find(key);
   if (it == staffMap.end())
      return nullptr;
   else 
      return it->second.c_str();          
}

您當然可以類似地為地圖修飾符創建包裝器,例如,用於插入新元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM