【问题标题】:constructing a pair(string, *node) to insert into an unordered_map构造一对(字符串,*节点)以插入到 unordered_map
【发布时间】:2015-07-11 08:16:56
【问题描述】:
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);
}

导致“无法将 'category' (type 'std::string(aka std::basic_string(char))') 类型转换为 type 'std::basic_string(char)&&”的错误 以及“无法将'node'(类型'relationNode*')转换为'relationNode*&&”的错误。

我打算先制作这对,然后将其插入到 unordered_map 中。

我正在使用“g++ -g -O0 -Wall -Wextra -std=gnu++11”来编译代码。任何帮助将不胜感激。

【问题讨论】:

  • 您应该使用make_pair(category, node),而不指定实际参数类型。 make_pair() 正是为此而设计的

标签: c++


【解决方案1】:

只写:

   relation_entry insertPair =
     make_pair(category, node);

这将工作并且更简洁(事实上,这就是你使用std::make_pair而不是首先直接调用构造函数的原因)。

您应该知道这是与 C++11 的向后兼容性问题。考虑这段 C++98 代码(我将 unordered_map 替换为 map 并将 using 替换为 typedef):

#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() {
}

转到http://cpp.sh/ 并尝试编译它。您会看到它在 C++98 模式下编译得很好,但在 C++11 和 C++14 模式下编译得不好。

有关问题的详细说明,请参阅C++11 make_pair with specified template parameters doesn't compile

底线:不要指定多余的类型参数,你会没事的。

【讨论】:

  • 只写relation_entry insertPair(category, node);。为什么这里需要make_pair? (或者有用吗?我知道如果要推断对的类型很有用,但在这种情况下我们已经知道目标对的类型。)
  • @dyp:对。但我猜(或希望)OP 的代码只是更复杂的东西的简化版本,std::make_pair 是合理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2017-10-11
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多