[英]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
是从模板参数派生的类型(在标准术语中为“依赖类型”),并且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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.