我正在使用 Boost 1.84 和 C++17,并且创建了一个继承自 boost::iterator_facade 的 polymorphic_iterator 类。这是我的课程的简化版本:
namespace iterator {
template <typename TValue,
typename TCategory,
typename TRef = TValue &,
typename TDiff = std::ptrdiff_t>
class polymorphic_iterator : public boost::iterator_facade<
polymorphic_iterator<TValue, TCategory, TRef, TDiff>,
TValue,
TCategory,
TRef,
TDiff>
{
public:
polymorphic_iterator() {}
template <typename TIter> polymorphic_iterator(TIter iter)
// ...
};
} // namespace iterator
当我尝试在单元测试中使用此迭代器时,出现以下错误:
error: no type named 'value_type' in 'std::iterator_traits<iterator::polymorphic_iterator<const char, boost::iterators::incrementable_traversal_tag>>'
我认为 boost::iterator_facade 将为 std::iterator_traits 提供必要的特征。为什么我会收到此错误以及如何修复它?
对于上下文,这就是我在单元测试中制作迭代器的方式:
iterator::polymorphic_iterator<const char, boost::incrementable_traversal_tag> iter;
我尝试显式定义 value_type
using value_type = TValue;
我考虑过扔掉这个恶心的东西,但它不是我的代码,而且它的耦合性很强。
是的,
boost::iterator_facade
定义了value_type
,但它在boost::iterator_facade
名称解析范围内。您可以将其带入 polymorphic_iterator
名称解析范围。
public:
using boost::iterator_facade<
polymorphic_iterator<TValue, TCategory, TRef, TDiff>, TValue, TCategory,
TRef, TDiff>::value_type;
polymorphic_iterator() {}