我正在尝试以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
错误消息,喜欢它取代int
了value_type
?
解决方案可能是显而易见的,但世界上所有的谷歌搜索并没有带我到任何地方。模板仍然让我感到困惑。
如果您还想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
有一个模板参数T
;Iterator
是非模板类;那里什么也没is_const
出现。如果我们暂时删除外部类,它将变得更加清晰:
class Foo;
template <bool b = false>
class Foo
{
// something
};
我相信以上所述显然是行不通的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句