C++ 构造一对(字符串,*节点)以插入无序的_映射 typedef无序映射关系映射; 使用关系\项=关系映射::值\类型; void insertNode(字符串类别,relationNode*节点){ 关系\u条目插入对= 制作_对(类别、节点); }
导致错误“无法将“category”(类型“std::string(aka std::basic_string(char)))转换为类型“std::basic_string(char)&&” 以及错误“无法将“节点”(类型“relationNode*”)转换为类型“relationNode*&&” 我打算制作一对,然后把它插入一张无序的地图 我正在使用“g++-g-O0-Wall-Wextra-std=gnu++11”来编译代码。任何帮助都将不胜感激。只要写下:C++ 构造一对(字符串,*节点)以插入无序的_映射 typedef无序映射关系映射; 使用关系\项=关系映射::值\类型; void insertNode(字符串类别,relationNode*节点){ 关系\u条目插入对= 制作_对(类别、节点); },c++,C++,导致错误“无法将“category”(类型“std::string(aka std::basic_string(char)))转换为类型“std::basic_string(char)&&” 以及错误“无法将“节点”(类型“relationNode*”)转换为类型“relationNode*&&” 我打算制作一对,然后把它插入一张无序的地图 我正在使用“g++-g-O0-Wall-Wextra-std=gnu++11”来编译代码。任何帮助都将不胜感激。只要写下: typedef unordere
typedef unordered_map<string, relationNode*> relationMap;
using relation_entry = relationMap::value_type;
void insertNode(string category, relationNode* node) {
relation_entry insertPair =
make_pair<string, relationNode*>(category, node);
}
这将有效且更加简洁(事实上,这就是您使用std::make_pair
而不是首先直接调用构造函数的原因)
您应该知道这是C++11的向后兼容性问题。考虑这段C++ 98代码(我用<代码>图MAP>代码> >代码> > <代码> > <代码> TyPufF >:
#包括
#包括
使用命名空间std;//只是为了测试
结构关系节点{};
类型定义映射关系映射;
typedef relationMap::值\类型关系\条目;
void insertNode(字符串类别,relationNode*节点){
关系\u条目插入对=
制作_对(类别、节点);
}
int main(){
}
转到并尝试编译它。您将看到它在C++98模式下编译得很好,但在C++11和C++14模式下编译得不好
有关此问题的详细说明,请参阅
一句话:不要指定多余的类型参数,你会没事的。你应该使用
make\u pair(category,node)
,而不指定实际的参数类型make_pair()
正是为此而设计的,只需编写关系项insertPair(类别、节点)代码>。为什么这里需要make\u pair
?(或者有用?我知道如果我们想推断成对的类型,这很有用,但在这种情况下,我们已经知道了目标对的类型。)@dyp:对。但我猜(或希望)OP的代码只是更复杂的东西的简化版本,其中std::make_pair
是合理的。
relation_entry insertPair =
make_pair(category, node);
#include <map>
#include <string>
using namespace std; // just for testing
struct relationNode {};
typedef map<string, relationNode*> relationMap;
typedef relationMap::value_type relation_entry;
void insertNode(string category, relationNode* node) {
relation_entry insertPair =
make_pair<string, relationNode*>(category, node);
}
int main() {
}