c++ - GCC 或 CLang 均未考虑部分类模板特化

标签 c++ templates partial-specialization

给出这个简单的例子:

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/

相关文章:

c++ - 索引超出 vector 类范围时没有编译错误或运行时错误?

c++ - 如何在 gdb 中将 void 指针转换为 unique_ptr<T>?

c++ - 函数类型不是模板非类型参数的有效类型?

c++ - 专门针对 STL 样式容器类型的函数

c++ - 为一些具有模板参数限制的外部模板类定义部分特化

c++ - 如何获取指向原始数据的 std::set 指针?

c++ - delete 一定是析构函数中的最后一条语句吗?

c++ - 如何防止 "How do you want to open this file"对话框?

c++ - 为模板特化初始化静态常量

c++ - 类模板名称中隐藏的 friend 与内联命名空间中的另一个符号冲突