假设我们有以下课程模板:
template<typename T, template<typename> class Container>
class Widget {};
在C ++ 17之前,您无法将std:vector
传递给Container
,因为std::vector
需要2个模板参数,而不是一个,即使第二个模板参数(分配器)具有默认值。所以以下内容无法编译:
Widget<int, std::vector> w; //ERROR in C++14
由于考虑了C ++ 17的默认模板参数,所以上面应该编译。但是,我在GCC 7.2.0和Clang 5.0.0中进行了测试,当它在GCC中工作时,它无法在Clang中编译,并显示以下消息:
prog.cc:10:22: error: template template argument has different template parameters than its corresponding template template parameter
Widget<int, std::vector> w;
^
/opt/wandbox/clang-5.0.0/include/c++/v1/vector:446:1: note: too many template parameters in template template argument
template <class _Tp, class _Allocator /* = allocator<_Tp> */>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:5:22: note: previous template template parameter is here
template<typename T, template<typename> class Container>
^~~~~~~~~~~~~~~~~~
知道为什么吗?