我需要获得对引用的迭代器的引用。但是,我的编译器对这段代码感到窒息:
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 '::'
答案 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
是从模板参数派生的类型(标准术语中的“依赖类型”),iterator
是SequenceT
中的嵌套类型,而不是函数或变量。当这两件事都成立时,编译器无法弄清楚你的意思,需要告诉我SequenceT::iterator
是typename
的类型。
答案 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();
}