在编写语法上非法的成员函数(完全)专门化时,如何删除该专门化



我正在编写一个指针类,并自然地将解引用运算符定义为成员函数。但是,如果这个类型现在是void,我需要删除那个函数,因为你不能取消引用void指针。但写出专业化本身就是一个语法错误:

// in ptr.h
template<typename T>
class ptr {
public:
T& operator * () const;
};

//in ptr.cpp
template<>
void& ptr<void>::operator * () const = delete;

那么我该如何实现呢?要修复语法错误,我必须犯一个语法错误?

我试着在std::unique_ptr类的源代码中查找,但我真的搞不懂tbh 的代码

您不能像尝试这样在头文件和cpp文件之间分离模板的声明和实现:

为什么模板只能在头文件中实现?

在任何情况下,都不能只专门化模板类的一个方法。你必须专门化整个模板,例如:

template<typename T>
class ptr {
public:
T& operator * () const;
};
template<>
class ptr<void> {
public:
// simply omit operator* altogether, since void& is illegal...
//void& operator * () const = delete;
};

实时演示

否则,您可以使用SFINAE在T=void时省略运算符,例如:

#include <type_traits>
template<typename T>
class ptr {
public:
template<typename U = T>
typename
std::enable_if<!std::is_same<U, void>::value, U&>::type
operator * () const;
};

实时演示

最新更新