我正在编写一个指针类,并自然地将解引用运算符定义为成员函数。但是,如果这个类型现在是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;
};
实时演示