类外部的类函数模板定义

问题描述 投票:1回答:1

所以我一直在编码自己的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):无法推断出«无名符号»的模板参数]

但是如果我在类内部编写实现,错误就会消失。我该如何解决?

c++ templates sfinae
1个回答
3
投票

如果要使reset()对SFINAE友好,请将其设为假模板:


1
投票

如果要使reset()对SFINAE友好,请将其设为假模板:

© www.soinside.com 2019 - 2024. All rights reserved.