给出这个简单的例子:
template<class T, class TT>
class make_it { };
template<class T>
class make_it<T, T*> { };
make_it<int>
我希望能够将它用作 make_it<type, type>
和make_it<type>
但代码末尾的示例模板调用无法编译。
当尝试使用 GCCI 编译它时,得到:
test-partial-spec.cpp:8:12: error: wrong number of template arguments (1, should be 2)
与 CLang 相同:
test-partial-spec.cpp:8:1: error: too few template arguments for class template 'make_it'
更让我困惑的是,当我以 here 为例时:
template<class T1, class T2, int I>
class A {};
template<class T, int I>
class A<T, T*, I> {};
A<int, 3>
它也不能编译:
海湾合作委员会:
test-partial-spec.cpp:18:9: error: wrong number of template arguments (2, should be 3)
18 | A<int, 3>
| ^
CLang:
test-partial-spec.cpp:18:8: error: template argument for template type parameter must be a type
A<int, 3>
^
这可能看起来是一个简单的问题,但如何使用比通用模板更少的参数来定义部分特化?
最佳答案
您无法进行部分特化,该部分特化需要比主模板更少的参数:它们必须采用相同的数量。
您的部分特化允许您自定义 make_if
的行为对于第二个模板参数是指向第一个模板参数的指针的情况。
如果您希望将第二个参数默认为指向第一个模板参数的指针,例如 make_it<int>
与 make_it<int, int*>
相同你可以这样做:
template<class T, class TT = T*>
class make_it { };
或者让它在某些特殊情况下工作,比如 T
供引用:
template<class T, class TT = std::add_pointer_t<T>>
class make_it { };
关于c++ - GCC 或 CLang 均未考虑部分类模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76013006/