ostream operator << перегружен для приема контейнеров STL, передача std :: string нарушает его? - PullRequest
0 голосов
/ 19 сентября 2018

Итак, я перегрузил оператор ostream <<, чтобы он мог взять большинство контейнеров STL и распечатать их.Однако это не работает для передачи строк (ошибка - «неоднозначная перегрузка» для строки «cout << s;»).Как мне сделать так, чтобы он работал на строках <strong>, как если бы он не был перегружен ?

#include <bits/stdc++.h>
using namespace std;

template<typename T>
ostream& _containerprint(ostream &out, T const &val) {
  return (out << val << " ");
}

template<typename T1, typename T2>
ostream& _containerprint(ostream &out, pair<T1, T2> const &val) {
  return (out << "{" << val.first << " " << val.second << "} ");
}

template<template<typename, typename...> class TT, typename... Args>
ostream& operator<<(ostream &out, TT<Args...> const &cont) {
  for(auto&& elem : cont) {
    _containerprint(out, elem);
  }
  return out;
}

int main() {
  string s = "help me";
  cout << s;
}

Редактировать: пожалуйста, перестаньте волноваться, #include <bits/stdc++.h> потому что это для программированияпостановка конкурса;это действительно не имеет значения!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Сделайте ваш параметр ostream более общим, чтобы ваша перегрузка была более общей, чем стандартная для std::string.

template<typename CharT, typename Traits, typename T>
ostream& _containerprint(std::basic_ostream<CharT, Traits> &out, T const &val) {
  return (out << val << " ");
}

template<typename CharT, typename Traits, typename T1, typename T2>
ostream& _containerprint(std::basic_ostream<CharT, Traits> &out, pair<T1, T2> const &val) {
  return (out << "{" << val.first << " " << val.second << "} ");
}

template<typename CharT, typename Traits, template<typename, typename...> class TT, typename... Args>
ostream& operator<<(std::basic_ostream<CharT, Traits> &out, TT<Args...> const &cont) {
  for(auto&& elem : cont) {
    _containerprint(out, elem);
  }
  return out;
}
0 голосов
/ 19 сентября 2018

std::string является классом шаблона (псевдоним std::basic_string<char>)

, поэтому std::cout << s соответствует вашей перегрузке и соответствует для std::basic_string<T>.

И ни одна перегрузка не является более специализированнойчем другие.

Возможный обходной путь - добавить дополнительную перегрузку для std::string:

std::ostream& operator << (std::ostream& out, const std::string& s)
{
    return operator << <char>(out, s);
    // Select template <class CharT, class Traits, class Allocator>
    // std::basic_ostream<CharT, Traits>& 
    // operator<<(std::basic_ostream<CharT, Traits>& os,
    //            const std::basic_string<CharT, Traits, Allocator>& str);
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...