我有这个类小部件:
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
from T* = double*
。在您的第二个声明的情况下,T
明确指定为double
,并且不进行模板参数推导。
还有第三个等效声明:
template<>
void widget_11::process_pointer<>(double*) = delete;
// T needs to be deduced here ^^
这些空尖括号可以省略,导致您的第一个声明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句