嵌套模板类中的std :: conditional

疯狂猴子

我正在尝试以STL样式实现RingBuffer。这意味着我也正在为其实现一个迭代器,该迭代器必须以const或non-const的方式工作。这只是迭代器的一部分:

#include <iterator>
#include <type_traits>

template <typename T> class RingBuffer {
public:
    class Iterator;
    // actual RingBuffer implementation here
};    

template <typename T, bool is_const=false> 
class RingBuffer<T>::Iterator {
public:
    typedef std::ptrdiff_t difference_type;
    typedef T value_type;
    typedef typename std::conditional<is_const, const value_type*, value_type*>::type pointer ;
    typedef typename std::conditional<is_const, const value_type&, value_type&>::type reference ;
    typedef std::random_access_iterator_tag iterator_category;

    // a bunch of functions here
    ...
};

GCC 4.8.0给出了我尝试访问迭代器的每一行的错误,例如

no type named 'type' in 'struct std::conditional<is_const, const int*, int*>'

替换已实例化int的类型RingBuffer<T>我不明白 is_const具有默认值。为什么不起作用?为什么不GCC替补多的false错误消息,喜欢它取代intvalue_type

解决方案可能是显而易见的,但世界上所有的谷歌搜索并没有带我到任何地方。模板仍然让我感到困惑。

Angew不再为SO感到骄傲

如果您还想Iterator通过进行模板化bool is_const,则必须这样声明:

template <typename T> class RingBuffer {
public:
    template <bool is_const = false>
    class Iterator;
    // actual RingBuffer implementation here
};    


template <typename T>
template <bool is_const> 
class RingBuffer<T>::Iterator {
public:
    typedef std::ptrdiff_t difference_type;
    typedef T value_type;
    typedef typename std::conditional<is_const, const value_type*, value_type*>::type pointer ;
    typedef typename std::conditional<is_const, const value_type&, value_type&>::type reference ;
    typedef std::random_access_iterator_tag iterator_category;

    // a bunch of functions here
    ...
};

说明:Iterator是类模板的成员,但是在您的原始代码中,Iterator它本身是非模板类。RingBuffer有一个模板参数TIterator是非模板类;那里什么也没is_const出现。如果我们暂时删除外部类,它将变得更加清晰:

class Foo;

template <bool b = false>
class Foo
{
  // something
};

我相信以上所述显然是行不通的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 11嵌套std :: conditional

来自分类Dev

模板类中的嵌套类问题

来自分类Dev

使用std :: conditional_variable阻止无锁队列

来自分类Dev

可变模板化使用std :: conditional,其中一种类型是实例化失败

来自分类Dev

@Conditional对继承的类不起作用?

来自分类Dev

如何使用std :: conditional根据模板参数类型设置类型

来自分类Dev

类模板中嵌套类模板的显式专业化

来自分类Dev

AMDEP未出现在AM_CONDITIONAL中

来自分类Dev

类模板声明中的C ++嵌套类

来自分类Dev

嵌套类作为模板参数

来自分类Dev

嵌套类中的模板别名可见性

来自分类Dev

或C#中的Conditional属性中的运算符

来自分类Dev

std :: conditional vs std :: enable_if

来自分类Dev

在RedShift中,Vertica的conditional_true_event是否可以替代?

来自分类Dev

嵌套类中的可变参数模板

来自分类Dev

嵌套模板类

来自分类Dev

在std :: conditional中使用模板来确定函数参数类型

来自分类Dev

模板类的嵌套类中的好友运算符

来自分类Dev

嵌套类作为C ++中父类的模板参数

来自分类Dev

检查嵌套的模板化类

来自分类Dev

C ++中的嵌套模板类中的“找不到成员声明”

来自分类Dev

std :: unique_lock <mutex>与conditional_variable cond的关系

来自分类Dev

模板类如何从嵌套模板类继承

来自分类Dev

定义模板类嵌套类的std :: hash的编译错误

来自分类Dev

使用嵌套类解析模板

来自分类Dev

使用 std::conditional 根据模板参数选择成员类型

来自分类Dev

C++ 嵌套模板类

来自分类Dev

模板类中嵌套类的C++静态成员变量

来自分类Dev

在菜单类型代码中,LOOP before CONDITIONAL 或 CONDITIONAL before LOOP 哪个更好?

Related 相关文章

热门标签

归档