所以我一直在编码自己的unique_ptr类,因此我必须以与处理其他类型不同的方式来处理数组。
template <typename TYPE, bool _arr = std::is_array<TYPE>::value>
class scoped_ptr final {
private:
typedef std::remove_extent_t<TYPE> gen;
gen* m_data;
public:
//some methods
void reset();
};
template<typename TYPE ,bool _arr>
inline void scoped_ptr<TYPE, _arr>::reset()
{
//some code...
}
问题是,当我使用std :: enable_if时,我希望reset方法仅适用于非数组分配,如果出现错误:“无法在外部类模板的成员的声明中指定默认模板参数同类””,尽管代码仍在编译中
template<typename TYPE ,bool _arr>
class scoped_ptr final {
public:
template<typename = typename std::enable_if<!_arr>::type>
void reset();
};
template<typename TYPE ,bool _arr>
template<typename = typename std::enable_if<!_arr>::type>
inline void scoped_ptr<TYPE, _arr>::reset()
{
}
我也尝试过这个,但是它也给出了一个错误:“模板参数列表必须与参数列表匹配”
template<typename TYPE ,bool _arr>
inline void scoped_ptr<TYPE, false>::reset()
{
}
有人对如何禁用此方法进行阵列有任何想法吗?我知道我可以专门研究scoped_ptr类,但我想避免代码重复。有什么办法吗?
编辑:
阅读回复后,我将代码更改为此:
template <typename TYPE, bool is_arr = std::is_array<TYPE>::value>
class scoped_ptr final {
private:
typedef std::remove_extent_t<TYPE> gen;
gen* m_data;
public:
//Some methods
template<bool _arr = is_arr, typename = typename std::enable_if<!_arr>::type>
void reset();
};
template<typename TYPE, bool is_arr>
template<bool, typename>
inline void scoped_ptr<TYPE, is_arr>::reset()
{
}
代码编译没有错误,直到我尝试调用该方法:
int main() {
scoped_ptr<int> ptr = new int;
ptr.reset();
}
那就是我得到的错误:“ void scoped_ptr«int,false»:: reset(void):无法推断出«无名符号»的模板参数]
但是如果我在类内部编写实现,错误就会消失。我该如何解决?
如果要使reset()
对SFINAE友好,请将其设为假模板:
如果要使reset()
对SFINAE友好,请将其设为假模板: