我试图做的事情:
template <class T>
ostream& operator<<(ostream& ou, map<T,T> x) {
for(typename map<T,T>::iterator it = x.begin(); it != x.end(); it++) {
ou << it->first << ": " << it->second << endl;
}
return ou;
}
我在主要测试了它:
int main() {
map<char, int> m;
m['a']++;
m['b']++;
m['c']++;
m['d']++;
cout << m << endl;
}
然后我得到了错误:
'错误:'运营商&lt;&lt;'不匹配在'std :: cout&lt;&lt; M'
如果我将函数参数从map<T,T>
更改为map<char,int>
,则重载运算符将起作用。我的代码中是否存在小问题,或者有完全不同的方法吗?一般来说,如何使用模板类重载容器类型的运算符?
答案 0 :(得分:8)
您的运算符仅适用于键类型和映射类型相同的地图(例如std::map<int,int>
或std::map<char,char>
。
您需要两个模板参数:
template <class K, class V>
std::ostream& operator<<(std::ostream& ou, const map<K,V>& x) { .... }
修改:请注意,没有理由复制map
,因此我修改了运算符以取代const
引用。
答案 1 :(得分:2)
你的模板论据说地图中的关键字和值是相同的。尝试更改此内容:
template <class T>
到此:
template <typename T1, typename T2>
然后用这些新的T1和T2更新你的其余代码。
答案 2 :(得分:2)
您为class T
制作了一个模板,但它应该是两个类:
template <class T, class U>
ostream& operator<<(ostream& ou, map<T,U> x) {
for(typename map<T,U>::iterator it = x.begin(); it != x.end(); it++) {
ou << it->first << ": " << it->second << endl;
}
return ou;
}