How could I print the contents of any container in a generic way?

c++, operator-overloading, stl, templates

Solution

You can restrict your operator<< to only apply to templated containers by specifying that the Container template parameter is itself templated. Since the C++ std containers also have an allocator template parameter you also have to include this as a template parameter of Container.

template
    < typename T
    , template<typename ELEM, typename ALLOC=std::allocator<ELEM> > class Container
    >
std::ostream& operator<< (std::ostream& o, const Container<T>& container)
{
    typename Container<T>::const_iterator beg = container.begin();

    o << "["; // 1

    while(beg != container.end())
    {
        o << " " << *beg++; // 2
    }

    o << " ]"; // 3

    return o;
}

int main()
{
    std::vector<int> list;

    list.push_back(0);
    list.push_back(0);

    std::cout << list;

    return 0;
}

Problem

I am trying to write a piece of code for fun using C++ templates. ``` #include <iostream> #include <vector> template <class Container> std::ostream& operator<<(std::ostream& o, const Container& container) { typename Container::const_iterator beg = container.begin(); o << "["; // 1 while(beg != container.end()) { o << " " << *beg++; // 2 } o << " ]"; // 3 return o; } int main() { std::vector<int> list; list.push_back(0); list.push_back(0); std::cout << list; return 0; } ``` The above code doesn't compile :) At 1, 2, 3 the same error is produced : error C2593: 'operator <<' is ambiguous All what I am trying to do is overloading the << operator to work with any container. Does that make sense ? How would that be done If possible, if not why ? EDIT :: Thanks for corrections :) 'sth' way is a good solution. I am just curious if this ambiguity -as Neil explained- would go away if we could use C++0x Concepts ?

Original source