我写了以下代码:
template<typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
os << "{";
for (auto i=v.begin(); i!=v.end(); ++i) {
os << *i << " ";
}
os << "}";
return os;
}
这适用于常规vector<int>
实例,但我想要做的是:
vector<vector<int> > v={{1,2},{3,4}}
cout << v; // Should print {{1 2 } {3 4 } }
相反,我收到编译错误(以下文字,有很多候选人):test.cpp|212|error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'std::vector<std::vector<int> >')|
我原以为模板化的函数可以递归使用两次。我错了吗?如果没有,是什么给出的?如果是这样,有没有办法在不重复代码的情况下制作这种通用的东西?
答案 0 :(得分:1)
#include <iostream>
#include <vector>
template<class T, class A>
std::ostream& operator<<(std::ostream& os, const std::vector<T,A>& v) {
os << "{";
for(auto&&e:v)
os<<e<<" ";
os << "}";
return os;
}
int main(){
std::vector<int> v1{1,2,3};
std::cout<<v1<<"\n";
std::vector<std::vector<int>> v2{{1},{2,3}};
std::cout<<v2<<"\n";
}
以上编译并运行。修复你的拼写错误,或者注意你正在使用的命名空间。除了当前命名空间或与ADL相关的任何操作符之外的任何操作符重载操作符都会失败。