Я пытаюсь сделать 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)