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<K,V>::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<string,Node>
。
【讨论】:
哇太棒了。我以前使用过 insert,这次忘记了插入一对,而不是单独的元素,但我不知道 emplace(),它确实工作得很好。谢谢!以上是关于C++ 映射错误,带有结构和方法,无法将字符串转换为 _Tree_iterator<std::_Tree_val<std::_Tree_simple_types< 等等的主要内容,如果未能解决你的问题,请参考以下文章
如何将映射字符串到结构的字典传递给带有busctl的d-bus方法?
带有实体框架和 SQL Server 数据库的 ASP.NET MVC - 图像未显示在视图中......错误显示“无法将“字节”转换为“字符串”