c++ - C ++打印模板容器错误(错误:'operator <<'的模糊重载)理解?
问题描述
我想编写可以打印容器的模板函数,例如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<<" ";
我知道<<
可以输出常见的类型。
int a = 0;
double f = 0.3;
std::string s = "123";
std::cout<<a<<f<<s<<std::endl;
那么为什么会出现上述错误?有什么办法可以解决吗?
我在 'std::cout << 中看到了这个问题 Ambiguous overload for 'operator<<'但我仍然无法清楚地理解。
所有代码:
#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;
}
解决方案
声明template<typename Container>
可能很危险,因为此模板包含“所有”变量类型int
等char
。由于此编译器不知道operator<<
使用哪个。
为了仅采用容器类型变量,请使用模板模板。这是适合您的工作代码
template<typename T, template <typename, typename> class Container>
std::ostream& operator<<(std::ostream& out, const Container<T, std::allocator<T>>& c) {
for (auto item : c) {
out << item << " ";
}
return out;
}
int main()
{
cout << "Hello world" << endl;
int arr[] = { 0,3,6,7 };
vector<int> v(arr, arr+4);
cout << v << endl;
return 0;
}
推荐阅读
- parsing - 如何为 select sql 语句编写语法?
- c++ - 在一台 PC 中执行 GUI,在其他 PC 中执行进程
- angularjs - 如何使用 Nginx 和 AngularJS 返回 HTTP 状态码 404
- android - 如何根据 Spinner 的选中项接收数据并显示记录。在 Android 的 SQLITE DatabaseHelper.java
- python - 损失函数中的Tensorflow Slicing
- javascript - 如何在 Google 表格中使用带有自定义 HTML 表单的引导日期时间选择器?
- node.js - Firebase 身份验证导致云函数返回空
- asynchronous - Elixir 等待多个并发任务中的任何一个完成
- reactjs - 我们可以将 Typescript 类分配给 React 中功能组件的 useState 字段吗?
- python - requests.get 没有获取所有标签。我需要那个页面的表格