C++ 映射错误,带有结构和方法,无法将字符串转换为 _Tree_iterator<std::_Tree_val<std::_Tree_simple_types< 等等

Posted

技术标签:

【中文标题】C++ 映射错误,带有结构和方法,无法将字符串转换为 _Tree_iterator<std::_Tree_val<std::_Tree_simple_types< 等等【英文标题】:C++ map error, with structures and methods, can't convert string to _Tree_iterator<std::_Tree_val<std::_Tree_simple_types< and so on 【发布时间】:2017-03-26 19:24:31 【问题描述】:

底线是我正在为结构编写一个方法,该方法添加到作为结构一部分的映射中。

在头文件中,对于结构体,map 变量被声明为 map(string,Node)(Node 是另一个结构体)(它在代码中使用 '>'s 只是在这个文本编辑器中那些不'不出现。)

Network 有一种方法,它接受一个 ifstream,并使用 getline 等来获取每一行中的数据并创建一个节点,该节点将添加到 Network 变量的映射中。

在头文件中,此映射称为“节点”。所以在该方法的代码中,我有nodes.insert(string-variable,node-variable)。我得到一个关于树的错误。

 error C2664: 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>> std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::insert(std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,const std::pair<const _Kty,_Ty> &)': cannot convert argument 1 from 'std::string' to 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>' 

在functions.h中,“网络”:

struct Network
    string label;
    map<string, Node> nodes;
    vector<string> route;

    Network()=default;
    Network(ifstream &);

    string to_string () const;
    Node get_node(string);
    void put_node(Node);
    bool in_route(const Node&);
    Node closest(Node &);
    string calculate_route(const Node&, const Node&);;

'Node'是它自己的结构,(int, int, string),在Network上面编码;让我知道我是否也应该包含它的代码。

现在在functions.cpp 中,我正在编写ifstream 构造函数的代码。我有

Network::Network(ifstream &file) 
    string line;
    Node temp;
    while (getline(file, line)) 
        stuff I know works at creating a node (int, int, string);
        nodes.insert(temp.label, temp);
    

所以,我尝试添加到 map(string,Node) 并且当我尝试使用字符串节点对时,它说它无法从字符串转换为带有 _Tree 的东西。

我在 Visual Studio 2015 中。

如果需要,我可以包含更多代码,我只是不想让它变得不必要的混乱。

【问题讨论】:

【参考方案1】:

查看map&lt;K,V&gt;::insert() 的文档。所有带有两个参数的重载都将迭代器作为第一个参数,而不是string。这就是您的编译器所抱怨的,因为它正在尝试将 string 转换为迭代器,但失败了。

你的意思是

nodes.insert(std::make_pair(temp.label, temp));

【讨论】:

绝对是这样。忘了我需要插入一对,而不是单独插入一对的内容。谢谢! @MaeganJohnson 如果这是一个正确的答案,你应该接受它,这样作者才能获得荣誉......【参考方案2】:

如错误消息所述,参数类型与std::map::insert() 的参数不匹配。

您似乎想直接在地图中构造Node,但std::map::insert() 不支持。

相反,您可以使用std::map::emplace()

nodes.emplace(temp.label, temp);

这是如何工作的? emplace() 是一个可变参数模板,它将完美地将其参数转发给std::map::value_type 的构造函数,即std::pair&lt;string,Node&gt;

【讨论】:

哇太棒了。我以前使用过 insert,这次忘记了插入一对,而不是单独的元素,但我不知道 emplace(),它确实工作得很好。谢谢!

以上是关于C++ 映射错误,带有结构和方法,无法将字符串转换为 _Tree_iterator<std::_Tree_val<std::_Tree_simple_types< 等等的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有 Union 的 C++ 结构转换为 C#?

如何将映射字符串到结构的字典传递给带有busctl的d-bus方法?

带有实体框架和 SQL Server 数据库的 ASP.NET MVC - 图像未显示在视图中......错误显示“无法将“字节”转换为“字符串”

将 C# 方法转换为 C++ 方法

C++中如何将一个字符串(string类型的)映射(转换)到枚举值(enum)

将带有结构字段的结构从 c++ 返回到 c# pinvoke