与“ operator <<”不匹配(操作数类型为“ std :: ostream” {aka“ std :: basic_ostream <char>”}和“ const std :: type_index”)

时间:2019-11-22 16:04:50

标签: c++ loops unordered-map visitor

实际上,我正在尝试将访客模式与一些模板一起使用。

我想解析我的unordered_map,其中包含type_indexfunction变量,但是即使在阅读了很多有关该主题的知识后,仍然遇到了我不理解的编译错误。

error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘const std::type_index’)
       std::cout << i.first << i.second << std::endl;

这是我的不编译的循环

for (auto i : functions) {
      std::cout << i.first << i.second << std::endl;
}

这是我的代码段,其中包含我的循环以分析和显示unordered_map

中的内容
template <typename TReturn> struct AnyVisitor {
  using typeInfoRef = std::reference_wrapper<const std::type_info>;
  using function = std::function<TReturn(std::any &)>;
  std::unordered_map<std::type_index, function> functions;

  template <typename TArg> void accept(std::function<TReturn(TArg &)> f) {
    functions.insert(std::make_pair(std::type_index(typeid(TArg)),
                                    function([&f](std::any &x) -> TReturn {
                                      return f(std::any_cast<TArg &>(x));
                                    })));

    for (auto i : functions) {
      std::cout << i.first << i.second << std::endl;
    }
  }

  TReturn operator()(std::any &x) {
    try {
      auto function = functions.at(std::type_index(x.type()));

      return function(x);
    } catch (...) {
      throw std::runtime_error("No visitor registered");
    }
  }
};

如果有人对如何解决有任何想法,我会很乐意接受!谢谢

1 个答案:

答案 0 :(得分:1)

您应该尝试打印i.first.name()而不是仅打印i.first