Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取模板迭代器引用的引用_C++_Iterator - Fatal编程技术网

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

C++ 获取模板迭代器引用的引用,c++,iterator,C++,Iterator,我需要得到一个引用的迭代器的引用。但是,我的编译器被以下代码阻塞: template <typename InputIterator> size_t iLongestBegin(InputIterator first, InputIterator last) { typedef typename std::iterator_traits<InputIterator>::reference SequenceT; //Problem is next l

我需要得到一个引用的迭代器的引用。但是,我的编译器被以下代码阻塞:

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

您是否没有在模板参数列表中指定
SequenceT
——它是在哪里定义的?或者您必须指出它是一个带有
typename SequenceT
的类型。您需要编写
typename SequenceT::iterator
,而不仅仅是
SequenceT::iterator
。这是因为
SequenceT
是从模板参数派生的类型(标准术语中是“依赖类型”),而
iterator
SequenceT
中的嵌套类型,而不是函数或变量。当这两种情况都成立时,编译器无法理解您的意思,需要告诉您,
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();
}
#包括
使用名称空间std;
模板大小\u t iLongestBegin(先输入计算器,后输入计算器){
typedef typename std::iterator_traits::reference SequenceT;
typedef typename std::iterator_traits::reference T;
对于(size_t idx;idxlength();idx++)
{
T curChar=(*first)[idx];
for(输入计算器cur=first;cur!=last;cur++)
{
if(cur->length()at(idx))!=_-tolower(curChar))
返回idx;
}
}
返回第一个->长度();
}
实际上,刚刚解决了:)

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

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();
}
模板大小\u t iLongestBegin(先输入计算器,后输入计算器)
{
typedef typename std::iterator_traits::reference SequenceT;
typedef typename std::iterator_traits::reference T;
对于(size_t idx;idxlength();idx++)
{
typename T curChar=(*first)[idx];
for(输入计算器cur=first;cur!=last;cur++)
{
if(cur->length()at(idx))!=_-tolower(curChar))
返回idx;
}
}
返回第一个->长度();
}

这是他标记为错误的那一行之前的一个typedef。函数被传递了一个std::list。将其更改为“typedef typename std::iterator_traits::reference T”;仍然没有joySequenceT是对迭代器序列中元素的引用,因此它没有任何嵌套的typedef。例如,如果InputIterator是vector::iterator,则SequenceT是“string&”。你能澄清一下在这种情况下你希望T是什么吗?T应该是wchar\T,因为迭代器指向一个std::listMine编译也很好,直到我调用它为止。你有没有抛出测试数据?没有。如果你对代码有问题,而这些问题只能通过某些测试数据来证明,请在你的问题中包含测试代码。问题代码就在那里。我的编译器甚至不尝试解析类型和编译任何模板函数,除非调用它们。不确定GCC是否这样做。C++编译器必须处理模板,不管它是否被使用。你仍然有一些错误。“typename T”应该只是“T”,在“std::iterator\u traits::value\u type::iterator”之前需要“typename”。看起来您使用的编译器太松散了。以后如果你想用另一个来编译,你会遇到很多问题,虽然现在还没有真正困扰我。这件事唯一会被指向的编译器是msvc++。不过谢谢你:)
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();
}