I am trying to overload operator<<() (i.e. inserter operator) for stl containers (e.g vector, list, array) (i.e. any container that support range-based for loop and whose value_type also has overload for operator<<()). I have written the following template function
template <template <class...> class TT, class ...T>
ostream& operator<<(ostream& out, const TT<T...>& c)
{
    out << "[ ";
    for(auto x : c)
    {
        out << x << " ";
    }
    out << "]";
}
It works for vector and list. But it gives error when I try to call it for array
int main()
{
    vector<int> v{1, 2, 3};
    list<double> ld = {1.2, 2.5, 3.3};
    array<int, 3> aa = {1, 2, 3};
    cout << v << endl;  // okay
    cout << ld << endl; // okay
    cout << aa << endl; // error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
                        // cout << aa << endl;
                        //         ^
}
Why it does not work for array?
Is there any work around to overcome this problem? 
I have searched in the internet and SO to find if there is a way to overload operator<<() for stl containers.
I have read answers in overloading << operator for c++ stl containers, but it does not answer my question.
And answers in Pretty-print C++ STL containers seems complecated to me.
g++ version:
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Compile command:
g++ -std=c++11
 
     
    