gpt4 book ai didi

compiler-errors - 通过为SFINAE使用enable_if编译错误

转载 作者:行者123 更新时间:2023-12-02 11:02:47 24 4
gpt4 key购买 nike

我正在尝试使用SFINAE进行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:

/*
类型名称std::enable_if >::value,list_type>::type
ei_alloc_memory(void * p_void,const list_type&p_temp)
{
返回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;
}

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

如果我使用注释函数,则会出现编译错误(无法重载)。为什么呢
它的签名应该与其他签名不同,因为返回类型应该不同。

提前致谢。

供测试使用:

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

完整的错误消息:

test6.cpp:63:13:错误:'类型名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:错误:类型名称为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::elem_base * const&)'
ei_alloc_memory(void * p_void,const list_type&p_temp)

最佳答案

您没有为共享指针指定模板参数,而是将其更改为:

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

(此外,ei_alloc_memory的实现存在一些语法错误)

关于compiler-errors - 通过为SFINAE使用enable_if编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31658719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com