我有这个类小部件:
class widget_11 {
public:
template<typename T>
void process_pointer(T* ptr)
{
std::cout << *ptr;
}
};
我的问题是我不明白两者的区别是什么这两个声明:
template<>
void widget_11::process_pointer(double*) = delete;
template<>
void widget_11::process_pointer<double>(double*) = delete;
我的问题是,如果删除函数的这两个定义做同样的事情?从我的测试来看,它们都可以编译并且没有改变代码的工作方式,但也许我在测试
时遗漏了一些重要的东西。这两个都是process_pointer
为T = double
的显式专门化的声明和定义,因此它们将以相同的方式定义相同的东西。
当您为显式专门化编写声明时,可以使用模板参数推导来填充未指定的类型。在你第一次申报的情况下,从T* = double*
推导出T
为double
。在第二个声明的情况下,T
被显式指定为double
,并且没有进行模板参数推导。
还有第三个等价声明:
template<>
void widget_11::process_pointer<>(double*) = delete;
// T needs to be deduced here ^^
这些空的尖括号可以省略,导致你的第一个声明。