перегрузка оператора неожиданно нарушает функции - PullRequest
2 голосов
/ 30 октября 2011

Неоднозначная перегрузка для operator<<() вызывается, когда я добавляю функцию перегрузки ниже

template <typename Container> ostream& operator<<(ostream& os, const Container& c)  
  {  
  copy(c.begin(), c.end(), ostream_iterator<typename Container::value_type>(os, " "));  
  return os;  
  }

ошибка вызывается для этой функции, где она использует <<.

  void print_list(const list<int>& list_int)
    {
    for (list<int>::const_iterator it = list_int.begin(); it != list_int.end(); it++) cout << *it << " ";
    }

Ответы [ 2 ]

4 голосов
/ 30 октября 2011

(Для справки, если кто-то еще ищет: http://ideone.com/YlX7q)

Ваше определение оператора << может быть создано как <code>::operator<<<int>(std::ostream&, const int&);это неоднозначно с std::operator<<(std::ostream&, int).Вызов имени типа Container не означает, что это контейнер;разрешение перегрузки выполняется до создания экземпляра определения.

1 голос
/ 30 октября 2011

Да, конечно, это не может работать. Вы вводите шаблонную перегрузку, и компилятор больше не знает, что использовать при использовании этого оператора. Просто вы не можете этого сделать.

Вы можете сделать что-то вроде этого:

template<class T>
friend ostream& operator<<(ostream& os, const MyClass<T>& r);

но вы не можете сделать

template<class T>
friend ostream& operator<<(ostream& os, const T& r);
...