在以下代码中:
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
,有时是“递增的左值无效”,有时是“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)
要求从 '__gnu_cxx::__normal_iterator, std::allocator > >' 转换为非标量类型 'Glib::ustring_Iterator<__gnu_cxx::__normal_iterator, std::allocator > >'
多谢!