运算符重载意外地破坏了函数

时间:2011-10-30 02:17:03

标签: c++ compiler-errors operator-overloading

当我在

下添加重载函数时,会调用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 个答案:

答案 0 :(得分:4)

(供参考,如果有其他人在寻找:http://ideone.com/YlX7q

您对运营商的定义&lt;&lt;可以实例化为::operator<<<int>(std::ostream&, const int&);这与std::operator<<(std::ostream&, int)形成了暧昧关系。调用Container类型的名称并不意味着它是一个容器;在实例化定义之前完成重载决策。

答案 1 :(得分:1)

是的当然这不行。 您正在引入模板化重载,并且编译器在您使用该运算符时不再知道要使用什么。 只是你做不到。

您可以这样做:

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

但你做不到

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