繁体   English   中英

获取模板迭代器参考的参考

[英]Getting the reference of a template iterator reference

我需要获取对引用的迭代器的引用。 但是,我的编译器对此代码感到窒息:

template <typename InputIterator> size_t iLongestBegin(InputIterator first, InputIterator last)
{
    typedef typename std::iterator_traits<InputIterator>::reference SequenceT;
        //Problem is next line
    typedef typename std::iterator_traits<typename SequenceT::iterator>::reference T;
    for(size_t idx; idx < first->length(); idx++)
    {
        T curChar = (*first)[idx];
        for (InputIterator cur = first; cur != last; cur++)
        {
            if (cur->length() < idx)
                return idx;
            if (_tolower(cur->at(idx)) != _tolower(curChar))
                return idx;
        }
    }
    return first->length();
}

关于如何解决它的任何想法? 错误是

error C2825: 'SequenceT': must be a class or namespace when followed by '::'

其实就是解决了:)

问题在于SequenceT是引用,而不是类型。 由于通常无法获取引用类型的地址,因此编译器不会为其生成迭代器。 我需要使用value_type而不是引用:

template <typename InputIterator> size_t iLongestBegin(InputIterator first, InputIterator last)
{
    typedef typename std::iterator_traits<InputIterator>::reference SequenceT;
    typedef typename std::iterator_traits<std::iterator_traits<InputIterator>::value_type::iterator>::reference T;
    for(size_t idx; idx < first->length(); idx++)
    {
        typename T curChar = (*first)[idx];
        for (InputIterator cur = first; cur != last; cur++)
        {
            if (cur->length() < idx)
                return idx;
            if (_tolower(cur->at(idx)) != _tolower(curChar))
                return idx;
        }
    }
    return first->length();
}

您是否错过了在模板参数列表中指定SequenceT的定义? 或者,也许您必须指出它是类型名称typename SequenceT的类型。

您需要编写typename SequenceT::iterator而不是SequenceT::iterator 这是因为SequenceT是从模板参数派生的类型(在标准术语中为“依赖类型”),并且iteratorSequenceT的嵌套类型,而不是函数或变量。 当这两种情况都成立时,编译器无法弄清您的意思,需要告知SequenceT::iterator是具有typename的类型。

以下可使用g ++ 4.4.0进行编译:

#include <iterator>
using namespace std;

template <typename InputIterator> size_t iLongestBegin(InputIterator first, InputIterator last) {
   typedef typename std::iterator_traits<InputIterator>::reference SequenceT;
   typedef typename std::iterator_traits<typename SequenceT::iterator>::reference T;
   for(size_t idx; idx < first->length(); idx++)
   {
      T curChar = (*first)[idx];
      for (InputIterator cur = first; cur != last; cur++)
      {
         if (cur->length() < idx)
             return idx;
         if (_tolower(cur->at(idx)) != _tolower(curChar))
             return idx;
      }
   }
    return first->length();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM