当我在
下添加重载函数时,会调用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 << " ";
}
答案 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);