Ошибка компиляции при использовании enable_if для SFINAE

Я пытаюсь выполнить упражнение с использованием SFINAE, но получаю непонятную ошибку компиляции.

У меня такой код:

#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 ‹std :: is_same‹ list_type, std :: shared_ptr>> :: value, list_type> :: type ei_alloc_memory (void * p_void, const list_type & p_temp) {return temp (static_cast *> (новый (p_void) elem_base (p_temp-> 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;
    }

Если я хорошо понял, enable_if возвращает второй параметр шаблона, если первый верен. Иначе не получится. Затем для функции-члена шаблона подпись формируется из входных параметров и возвращаемого значения.

Если я использую закомментированную функцию, я получаю ошибку компиляции (не может быть перегружена). Почему ? Его подпись должна отличаться от другой, потому что тип возвращаемого значения должен быть другим.

Заранее спасибо.

Для тестового использования:

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

Полное сообщение об ошибке:

test6.cpp: 63: 13: error: 'typename std :: enable_if :: elem_base *, more_container :: raw_doubly_list :: elem_base *> :: value, more_container :: raw_doubly_list :: elem_base *> :: type more_container :: raw_doubly_list :: ei_alloc_memory (void *, more_container :: raw_doubly_list :: elem_base * const &) 'не может быть перегружен ei_alloc_memory (void * p_void, const list_type & p_temp) ^ test6.cpp: 57: 13: ошибка: с' typename std :: enable_if: : elem_base *, std :: shared_ptr :: elem_base>> :: value, more_container :: raw_doubly_list :: elem_base *> :: type more_container :: raw_doubly_list :: ei_alloc_memory (void *, more_container :: raw_doubly_list :: const &) 'ei_alloc_memory (void * p_void, const list_type & p_temp)


person GTA    schedule 27.07.2015    source источник


Ответы (1)


Вы пропустили указание параметра шаблона для общего указателя, изменили его на:

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

(также реализация ei_alloc_memory имеет некоторые синтаксические ошибки)

person TomSmartBishop    schedule 04.12.2015