模板模板参数和“<<”运算符(ostream)

Template template parameters and "<<" operator (ostream)

几天来,我一直在努力理解模板模板参数。我试图在 Visual Studio 中使用 C++17 编写示例,但出现此错误:

Error   C2679   binary '<<': no operator found which takes a right-hand operand of type 'std::vector<int,std::allocator<int>>' (or there is no acceptable conversion)

对于这个例子,我尝试使用来自 STL 的通用容器来突出 C++ 中模板模板参数的想法。

#include <iostream>
#include <vector>
using namespace std;

template<typename T, template<typename> typename Tpl_Type>
ostream& operator <<(ostream& out,const Tpl_Type<T>& x) {
    for (auto& aux : x)
        out << aux << "   ";
    out << endl;
    return out;
}

template<typename T, template<typename>typename Tpl_Type>
void functioon()
{
    
    Tpl_Type<T> vect2;
    for (auto i = 0; i < 5; i++) {
        vect2.push_back(i);
    }
    std::cout << vect2 << endl;
    return;
}

int main()
{

    functioon<int, std::vector>();
    return 0;
}

我做错了什么?

std::vector是模板参数多于1个的模板,所以functioonoperator<<要接受它作为模板模板参数,模板模板参数本身需要接受可变数量的模板参数:

template<typename T, template<typename ...> typename Tpl_Type>
                                    // ^^^

如果不使其可变,clang 和 msvc 将无法编译代码。 gcc 编译两个版本,但我怀疑这是一个错误。

这里是 demo