【发布时间】:2018-07-26 05:20:35
【问题描述】:
我想编写可以打印容器的模板函数,如std::vector,std::list。
下面是我的函数,只是重载<<。
template<typename Container>
std::ostream& operator<<(std::ostream& out, const Container& c){
for(auto item:c){
out<<item;
}
return out;
}
测试代码如下:
int main(){
std::vector<int> iVec{5, 9, 1, 4, 6};
std::cout<<iVec<<std::endl;
return 0;
}
输出:
59146
并且我想在每个值中添加一个空格字符串(输出类似于5 9 1 4 6),所以我将函数更改为:
template<typename Container>
std::ostream& operator<<(std::ostream& out, const Container& c){
for(auto item:c){
out<<item<<" ";
}
return out;
}
然后报错:
merror: ambiguous overload for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'const char [2]')
out<<item<<" ";
我知道<< 可以输出普通类型like。
int a = 0;
double f = 0.3;
std::string s = "123";
std::cout<<a<<f<<s<<std::endl;
那么为什么会出现上述错误?有什么办法可以解决吗?
我看到了这个问题Ambiguous overload for ‘operator<<’ in ‘std::cout <<,但还是看不懂。
所有代码:
#include <iostream>
#include <vector>
template<typename Container>
std::ostream& operator<<(std::ostream& out, const Container& c){
for(auto item:c){
out<<item;
// out<<item<<" "; // error
}
return out;
}
int main(){
std::vector<int> iVec{5, 9, 1, 4, 6};
std::cout<<iVec<<std::endl;
return 0;
}
【问题讨论】:
-
请发帖minimal reproducible example。谢谢。
-
请勿粘贴文字图片。
-
您链接的问答中的答案 2 非常有效。问题是
const Container& c太宽泛了。它可以是任何东西。一个容器,一个字符串,一个整数,一个袋熊......你的名字。你会得到一个模板化的<<,它可以替换所有<<重载,所以可怜的编译器不知道它应该使用哪个<<,你的或者打算与char数组一起使用的那个。 -
@PaulSanders ,我已经更新了所有代码。
-
说实话,这张照片并没有那么可恶。图像的问题是它们比文本更难搜索,对视障者不透明,经常被防火墙阻止,链接失效,无法编译,最糟糕的是,用来代替实际的问题解释。您的图片是补充信息,是额外的。