[求助] 用C::B编译错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变

软件和网站开发以及相关技术探讨
回复
头像
smhong
帖子: 11
注册时间: 2008-10-24 10:59
来自: 重庆
联系:

[求助] 用C::B编译错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变

#1

帖子 smhong » 2008-11-13 14:58

代码:

代码: 全选

void Reader::DelBook(Book it)
{
    for(int i=CounterB;i>0;i--)   //错误:   在‘i’使用过时的绑定|
        if(books[i].GetCode()==it.GetCode())
        break;
        for(int j=i;j<CounterB;j++)  //错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变化|
        books[j]=books[j+1];

    CounterB--;
}
与代码:

代码: 全选

void Reader::DelMagazine(Magazine it)
{
    for(int i=CounterM;i>0;i--)  //错误:   在‘i’使用过时的绑定|
        if(magazines[i].GetCode())
        break;

    for(int j=i;j<CounterM;j++)   //错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变化|
        magazines[j]=magazines[j+1];

    CounterM--;
}
我查过了,好像是编译器版本的问题(版本太新),但是我一直没有想到办法解决,请大家赐教,如何解决?谢谢!
我在线等候,谢谢了!!
人应“愤“发自强,没有愤怒,怎能自强!加油,洪哥!
头像
wenstream
帖子: 186
注册时间: 2008-06-18 22:02

Re: [求助] 用C::B编译错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变

#2

帖子 wenstream » 2008-11-13 19:30

上下两段代码结构类似,这里以第2段为例:
代码:
void Reader::DelMagazine(Magazine it)
{
for(int i=CounterM;i>0;i--) //错误: 在‘i’使用过时的绑定|
if(magazines.GetCode())
break;
//mark: i的作用域已经结束
for(int j=i;j<CounterM;j++) //错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变化|
magazines[j]=magazines[j+1];

CounterM--;
}


其中第一个for循环中只有一个语句
if(magazines.GetCode())
break;
在第一个for循环初始语句中定义的变量i,当for循环结束时,其作用域已经结束,在第二个for循环已经不能再使用i。
在一些比较旧的对标准支持不那么好的编译器上,可以这么写,变量i在第一个for循环后还可以用,但是新版编译器一般对标准支持比较好,所以会报错
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星

Re: [求助] 用C::B编译错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变

#3

帖子 xhy » 2008-11-13 20:04

你的知识要更新了

for语句中声明的变量不能在for的作用域之外使用

int j=i 这里i已经不存在了
目前负债150多万
dbzhang800
帖子: 3182
注册时间: 2006-03-10 15:10
来自: xi'an China
联系:

Re: [求助] 用C::B编译错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变

#4

帖子 dbzhang800 » 2008-11-18 12:45

smhong 写了:代码:

代码: 全选

void Reader::DelBook(Book it)
{
    for(int i=CounterB;i>0;i--)   //错误:   在‘i’使用过时的绑定|
        if(books[i].GetCode()==it.GetCode())
        break;
        for(int j=i;j<CounterB;j++)  //错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变化|
        books[j]=books[j+1];

    CounterB--;
}
我查过了,好像是编译器版本的问题(版本太新),但是我一直没有想到办法解决,请大家赐教,如何解决?谢谢!
我在线等候,谢谢了!!
不是编译器版本太新,是C++ 标准就是这么要求的。如果真不报错,只能说明一个问题,你所用的编译器不符合标准。

代码: 全选

for(int i=CounterB;i>0;i--)
这样声明的i只能在这个循环体内使用。

如果你不想对代码做较大的改动,直接改为

代码: 全选

int i;
for(i=CounterB;i>0;i--)
即可。
头像
smhong
帖子: 11
注册时间: 2008-10-24 10:59
来自: 重庆
联系:

Re: [求助] 用C::B编译错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变

#5

帖子 smhong » 2008-11-19 11:26

谢谢各位指教,大家辛苦了!呵呵。 :em51

另外,还有个问题一直困扰着我,虽然能通过编译,但是都要提示警告!
代码如下:

代码: 全选

int main(void)
{
    Book b1("谭浩强","C++面向对象程序设计","P306/5",10001);  //|9|警告: 不建议使用从字符串常量到‘char*’的转换|
    Book b2("洪哥","操作系统教程","P306/7",10002);  //|10|警告: 不建议使用从字符串常量到‘char*’的转换|

    Magazine m1("计算机学报",13,20001);   //|12|警告: 不建议使用从字符串常量到‘char*’的转换|
    Magazine m2("计算机应用",2,20002);  //|13|警告: 不建议使用从字符串常量到‘char*’的转换|

    Reader r1("张三",30001);    //|15|警告: 不建议使用从字符串常量到‘char*’的转换|
    Reader r2("李四",30002);   //|16|警告: 不建议使用从字符串常量到‘char*’的转换|
    r1.Show();
    r2.Show();

    r1.AddBook(b1);
    r1.AddBook(b2);
    r1.ShowBooks();

    r2.AddMagazine(m1);
    r2.AddMagazine(m2);
    r2.DelMagazine(m1);
    r2.ShowMagazines();
}
编译提示如下:

代码: 全选

/resurce/exam5-7.cpp||In function ‘int main()’:|
/resurce/exam5-7.cpp|9|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|9|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|9|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|10|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|10|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|10|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|12|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|13|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|15|警告: 不建议使用从字符串常量到‘char*’的转换|
/resurce/exam5-7.cpp|16|警告: 不建议使用从字符串常量到‘char*’的转换|
||=== Build finished: 10 errors, 0 warnings ===|
请问,这种情况在标准C++中如何处理!!
人应“愤“发自强,没有愤怒,怎能自强!加油,洪哥!
头像
Final_x
帖子: 383
注册时间: 2008-05-03 23:05
联系:

Re: [求助] 用C::B编译错误: 在新的 ISO‘for’作用域中,‘i’的名称查找有变

#6

帖子 Final_x » 2008-11-20 2:35

说一点点:不知道对不对?
类似"C++面向对象程序设计"这样的都是字符串常量,不可修改值的,而char *是可以通过指针修改字符值的
建议char * 改为 const char *
回复