在下面的代码中:
int utf8len(char* s, int len)
{
Glib::ustring::iterator p( string::iterator(s) );
Glib::ustring::iterator e ( string::iterator(s+len) );
int i=0;
for (; p != e; p++) // ERROR HERE!
i++;
return i;
}
我在 for
行收到编译器错误,有时是“increment 中的左值无效”,有时是“ISO C++ 禁止递增类型指针等...”。
然而,下面的代码:
int utf8len(char* s)
{
Glib::ustring us(s);
int i=0;
for (Glib::ustring::iterator p = us.begin(); p != us.end(); p++)
i++;
return i;
}
编译并工作正常。
根据 Glib::ustring 文档和包含文件,ustring 迭代器可以从 std::string
迭代器构造,并定义了 operator++()
。奇怪吗?
---编辑---
它变得“越来越好奇”!这段代码
int utf8len(string::iterator s, string::iterator e)
{
Glib::ustring::iterator p(s);
Glib::ustring::iterator end(e);
int i=0;
for (; p != end; p++)
i++;
return i;
}
编译并工作正常。
---编辑---
奖金问题:)
这两种定义变量的方式在 C++ 中有区别吗:
classname ob1( initval );
classname ob1 = initval;
我相信他们是同义词;然而,如果我改变
Glib::ustring::iterator p( string::iterator(s) );
到
Glib::ustring::iterator p = string::iterator(s);
我得到一个编译器错误 (gcc 4.1.2)
conversion from ‘__gnu_cxx::__normal_iterator, std::allocator > >’ to non-scalar type ‘Glib::ustring_Iterator<__gnu_cxx::__normal_iterator, std::allocator > > >’ requesed
非常感谢!
最佳答案
你的声明声明了这个函数:
Glib::ustring::iterator p(string::iterator s);
代码中 s
周围的括号将被忽略。它们就像下面示例中 n
周围的括号
int(n);
n = 0; /* n is actually an int variable! */
它们用于分组修饰符,如指针 (*
) 或引用 (&
)(想想 void(*fptr)()
) .在您的情况下,括号只是语义上多余的。
试试这个:
Glib::ustring::iterator p( (string::iterator(s)) );
引入的括号让编译器重新认识到它应该构造一个从表达式初始化的对象p
(因为函数参数声明不能有括号,它不会被解析为参数声明,而是作为初始值设定项)。
关于c++ - 无法增加 Glib::ustring::iterator(出现 "invalid lvalue in increment"编译器错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2938744/