c++ - 无法增加 Glib::ustring::iterator(出现 "invalid lvalue in increment"编译器错误)

标签 c++ iterator glib

在下面的代码中:

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/

相关文章:

c++ - 为什么 0 == ("abcde"+1) 不是常量表达式?

C++11 线程,在主线程上运行

c++ - 迭代器数组c++中的集合

javascript - jquery bool 迭代器

c++ - 使用大型库是否会固有地使代码变慢?

c - 油嘴滑舌 C : program does not recognize GLIB library

c++ - C++中的正弦波生成

c++ - 用 QLinearGradient 绘制 QPushButton

java - 澄清 HashMap 中的 @ConcurrentModificationException

c - 在 C 中使用 g_socket_send 发送十六进制值