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

发布于 2024-12-12 19:45:27 字数 571 浏览 0 评论 0原文

添加重载函数时,会调用 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 << " ";
    }

Ambiguous overload for operator<<() is called when I add the overload function below

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

the error is called on this function where it uses the <<.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

£噩梦荏苒 2024-12-19 19:45:27

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

您对运算符的定义< <可以实例化为 ::operator<<(std::ostream&, const int&);这对于 std::operator<<(std::ostream&, int) 来说是不明确的。调用类型 Container 的名称并不意味着它是一个容器;而是意味着它是一个容器。重载决策在定义实例化之前完成。

(For reference, if anyone else is looking: http://ideone.com/YlX7q )

Your definition of operator<< can be instantiated as ::operator<<<int>(std::ostream&, const int&); this is ambigious with std::operator<<(std::ostream&, int). Calling the name of the type Container doesn't mean it is a container; overload resolution is done before the definition is instantiated.

り繁华旳梦境 2024-12-19 19:45:27

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

你可以做这样的事情:

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

但你不能这样做

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

Yes of course this cannot work.
You are introducing a templated overload, and the compiler don't know anymore what to use when you use that operator.
Simply you cannot do that.

You can do something like this:

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

but you cannot do

template<class T>
friend ostream& operator<<(ostream& os, const T& r);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文