Не подходит для «operator‹‹» (типы операндов — «std::ostream» {также известный как «std::basic_ostream‹char›»} и «const std::type_index»)

На самом деле, я пытаюсь использовать шаблон посетителя с некоторыми шаблонами.

Я хочу проанализировать мой unordered_map, который содержит type_index и переменную function, но я получаю ошибку компиляции, которую я не понимаю, даже после прочтения множества тем об этом.

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");
    }
  }
};

Если у кого-то есть идея, как это решить, я с радостью возьмусь за нее! Спасибо


person Hugo Sohm    schedule 22.11.2019    source источник
comment
Что не получить? std::type_index не имеет определенного operator <<.   -  person NathanOliver    schedule 22.11.2019
comment
Вы имели в виду std::cout << i.first.name()?   -  person Yksisarvinen    schedule 22.11.2019
comment
Я не понимаю, мне не нужно определять оператор для type_index для зацикливания на unordered_map нет?   -  person Hugo Sohm    schedule 22.11.2019
comment
Не зацикливать, но вы пытаетесь его вывести. Для std::type_index не определен оператор вывода   -  person NathanOliver    schedule 22.11.2019
comment
@HugoS нет, вам нужно operator<<, чтобы иметь возможность выводить тип в std::ostream   -  person Slava    schedule 22.11.2019
comment
Я забыл определить метод имени для type_index, спасибо Yksisarvinen   -  person Hugo Sohm    schedule 22.11.2019


Ответы (1)


Вы должны попытаться напечатать только i.first.name() вместо i.first

person Papaya    schedule 27.11.2019