获取模板迭代器引用的引用

时间:2009-05-16 12:35:24

标签: c++ iterator

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

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 '::'

4 个答案:

答案 0 :(得分:1)

实际上,只是解决了它:)

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

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();
}

答案 1 :(得分:0)

您是否错过了在模板参数列表中指定SequenceT - 它在何处定义?或者您可能必须表明它是typename SequenceT的类型。

答案 2 :(得分:0)

您需要撰写typename SequenceT::iterator而不仅仅是SequenceT::iterator。这是因为SequenceT是从模板参数派生的类型(标准术语中的“依赖类型”),iteratorSequenceT中的嵌套类型,而不是函数或变量。当这两件事都成立时,编译器无法弄清楚你的意思,需要告诉我SequenceT::iteratortypename的类型。

答案 3 :(得分:0)

以下用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();
}