重载'opeator<<'对于C ++中带有模板类的容器类型

时间:2013-12-18 19:56:12

标签: c++ templates operator-overloading

我试图做的事情:

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>,则重载运算符将起作用。我的代码中是否存在小问题,或者有完全不同的方法吗?一般来说,如何使用模板类重载容器类型的运算符?

3 个答案:

答案 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;
}