C++ std::make_pair问题

主要代码:

using TransMap = unordered_map<::string,astring>;
///返回得到的语言数量
TransMap *currentTranslates
unordered_map<::string,TransMap> summTrans;

TransMap d;
string n = ...;
astring a = ...;
d.insert(std::make_pair<string,astring>(n,a));

报错:

error: no matching function for call to 'make_pair<std::__cxx11::string, alib::astring>(std::__cxx11::string&, alib::astring&)'|

就奇怪,不是value支持自定义的类型吗,key的话写个hash函数也支持自定义类型

另外astring虽然是dll类,但是已经用了extern "C"改编,并且刚才我不改编它编译后仍然报同样的错误

如果使用自动推导又会出现这样的错误:

error: no matching function for call to 'std::unordered_map<std::__cxx11::basic_string<char>, alib::astring>::insert(std::pair<std::__cxx11::basic_string<char>, alib::astring>)'|
//他这个函数搁这隔这呢!

平台:
Windows
C++17
G++: gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

前面加个 std::unordered_map<::string,TransMap> summTrans;
试一下

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题是由于std::make_pair函数的调用方式不正确导致的。

    问题出现在以下代码中:

    d.insert(std::make_pair<string, astring>(n, a));
    

    std::make_pair是一个模板函数,它会根据传入的参数类型自动推导出返回类型。所以在这里你不需要显式指定模板参数,只需要传入正确的参数即可。

    请尝试修改如下代码:

    d.insert(std::make_pair(n, a));
    

    这样应该就可以解决编译错误了。

    关于第二个错误,你可以尝试使用emplace函数来插入键值对,它会更高效地构造元素。请修改如下:

    d.emplace(n, a);
    

    这样应该就能够成功插入键值对了。

    完整的代码应该是这样的:

    using TransMap = std::unordered_map<::std::string, astring>;
    
    // 返回得到的语言数量
    TransMap *currentTranslates;
    std::unordered_map<::std::string, TransMap> summTrans;
    
    TransMap d;
    std::string n = ...;
    astring a = ...;
    d.emplace(n, a);
    

    希望这能帮助到你解决问题。如果还有其他疑问,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考一下这个代码

#include <iostream>
#include <map>
#include <unordered_map>
using namespace std;

class Penis
{
    int length;
public:
    Penis(int&&);
};


Penis::Penis(int&& x)
{
    length=x;
}

int main()
{
    unordered_map<int, Penis*> dick;
    Penis my_penis = Penis(514);
    dick.insert(make_pair<int, Penis*>(114, &my_penis));
}