2015-07-27 2 views
0

Я пытаюсь сделать excersize bu с помощью SFINAE, но я получаю ошибку компиляции, которую я не понимаю.Ошибка компиляции с помощью enable_if для 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 зЬй :: enable_if < зЬй :: is_same < list_type, зЬй :: shared_ptr>> :: значение, list_type> :: Тип ei_alloc_memory (void * p_void, const list_type & p_temp) { return temp (static_cast *> (new (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 возвращает второй параметр шаблона, если первый верно. В противном случае он терпит неудачу. Затем для функции члена шаблона подпись формируется входными парами и возвращаемым значением.

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

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

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

г ++ -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 *> :: значение, 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: error: with 'typename std :: enable_if :: elem_base *, std :: shared_ptr :: elem_base>> :: значение, more_container :: raw_doubly_list :: elem_base *> :: Тип more_container :: raw_doubly_list :: ei_alloc_memory (пустота *, more_container :: raw_doubly_list :: elem_base * Const &)» ei_alloc_memory (недействительными * p_void, Const list_type & p_temp)

ответ

0

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

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

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

Смежные вопросы