首页 > 解决方案 > C ++打印模板容器错误(错误:'operator <<'的模糊重载)理解?

问题描述

我想编写可以打印容器的模板函数,例如std::vectorstd::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;
}

标签: c++c++11

解决方案


声明template<typename Container>可能很危险,因为此模板包含“所有”变量类型intchar。由于此编译器不知道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;
}

推荐阅读