使用SF_AE的enable_if编译错误

时间:2015-07-27 16:43:13

标签: compiler-errors sfinae enable-if

我正在尝试使用SFINAE进行excersize bu,但是我得到了一个我不理解的编译错误。

我有以下代码:

#include <cstddef>                      // for size_t & NULL
#include <memory>
#include <cstdlib>
#include <iostream>
#include <type_traits>

namespace more_container
{            
    template <typename T>
    class raw_doubly_list
    {
        public:
            template<typename T1, typename T2>
            friend struct std::is_same;
        public:
            template <typename V>
            struct elem_base
            {
            };  // struct elem_base              
        public:
            #ifdef SMART_PTR
                typedef std::shared_ptr<elem_base<T> > list_type;                            
            #elif defined RAW_PTR
                typedef elem_base<T>* list_type;
            #endif                    
        public:
            typedef T value_type;

            struct delete_elem
            {

            };  // struct delete_elem            
        private: 

/ *
                typename std :: enable_if&lt;的std :: is_same&LT; list_type,std :: shared_ptr&gt; &gt; :: value,list_type&gt; :: type                 ei_alloc_memory(void * p_void,const list_type&amp; p_temp)                 {                     return temp(static_cast *&gt;(new(p_void)elem_base(p_temp-&gt; m_object)),delete_elem());                 }    * /

            typename std::enable_if< std::is_same< list_type,elem_base<T>* >::value,list_type >::type
            ei_alloc_memory(void* p_void,const list_type& p_temp)
            {
                return static_cast<elem_base<T>*>(new (p_void) elem_base<T>(p_temp->m_object));
            }  

            list_type alloc_memory(const list_type& p_temp);            
        private:                     
            list_type p_to_head;
    };  // class raw_doubly_list

    //alloca memory
    template <typename T>
    typename raw_doubly_list<T>::list_type raw_doubly_list<T>::alloc_memory(const list_type& p_temp)
    {
        list_type ret = NULL;
        void* p_void = malloc(sizeof(elem_base<T>));  
        return ei_alloc_memory(p_void,p_temp);
    }    
}

    int main()
    { 
        return 0;
    }

如果我理解的话,如果第一个模板参数为true,则enable_if返回第二个模板参数。否则它会失败。 然后,对于模板成员函数,签名由输入参数和返回值组成。

如果我使用注释函数,我会得到一个编译错误(不能重载)。为什么? 它的签名应该与其他签名不同,因为返回类型应该不同。

提前致谢。

供测试使用:

g ++ -Wall -std = c ++ 0x -DRAW_PTR test6.cpp

完整的错误消息:

test6.cpp:63:13:错误:'typename std :: enable_if :: elem_base *,more_container :: raw_doubly_list :: elem_base *&gt; :: value,more_container :: raw_doubly_list :: elem_base *&gt; ::输入more_container :: raw_doubly_list :: ei_alloc_memory(void *,more_container :: raw_doubly_list :: elem_base * const&amp;)'不能重载              ei_alloc_memory(void * p_void,const list_type&amp; p_temp)              ^ test6.cpp:57:13:错误:使用'typename std :: enable_if :: elem_base *,std :: shared_ptr :: elem_base&gt; &gt; :: value,more_container :: raw_doubly_list :: elem_base *&gt; :: type more_container :: raw_doubly_list :: ei_alloc_memory(void *,more_container :: raw_doubly_list :: elem_base * const&amp;)'              ei_alloc_memory(void * p_void,const list_type&amp; p_temp)

1 个答案:

答案 0 :(得分:0)

您错过了为共享指针指定模板参数,将其更改为:

typename std::enable_if< std::is_same<list_type,std::shared_ptr<elem_base<T>>>::value>::type

(也是ei_alloc_memory的实现有一些语法错误)