回 帖 发 新 帖 刷新版面

主题:[讨论]VS中的<<重载

写了段程序,里面要重载<<操作符用来输出信息
相关代码如下:
std::ostream&  operator<< (std::ostream &output, const Room &thisRoom )
{
    output<<"You are in "<<thisRoom.description<<"\nYou can move to:";
    if(thisRoom.Neighbor[(int)east]!=NULL)
        output<<"e\t";
    if(thisRoom.Neighbor[(int)west]!=NULL)
        output<<"w\t";
    if(thisRoom.Neighbor[(int)south]!=NULL)
        output<<"s\t";
    if(thisRoom.Neighbor[(int)north]!=NULL)
        output<<"n\t";
    output<<"\nEnter the direction:Q for quit";
    return output;
}
编译中始终出现一个警告:c:\documents and settings\kant\my documents\visual studio 2008\projects\maze\maze\room.h(96) : warning C4717: “operator<<”: 如递归所有控件路径,函数将导致运行时堆栈溢出
这个96行就是最后的右大括号的地方。
编译后运行时无限重复"You are in "直至程序崩溃

但是同样的代码用gcc编一下(dev c++)就没问题,能正确运行

请教大家这是什么问题呢?

回复列表 (共9个回复)

沙发

呵呵,我这里没有vs,你试试如下代码,看看是不是也会警告
void foo( int )
{
}
void foo( float )
{
    foo( 0 );
}
如果是那就太傻了

板凳

上述用例编译是没错的,纠结啊

3 楼

thisRoom.description
这个成员的类型该不会是Room吧?-_-   如果是的话,出现死递归就是合理的了。
用您的代码,添加一些变成完整程序,编译运行,没有死递归,没有崩溃。


[code=c]#include <iostream>
#include <string>

enum {
    east,
    west,
    south,
    north,
};

class Room {
public:
    std::string description;
    Room* Neighbor[4];

    Room()
    {
        Neighbor[0] = Neighbor[1] = Neighbor[2] = Neighbor[3] = NULL;
    }
};

std::ostream&  operator<< (std::ostream &output, const Room &thisRoom )
{
    output<<"You are in "<<thisRoom.description<<"\nYou can move to:";
    if(thisRoom.Neighbor[(int)east]!=NULL)
        output<<"e\t";
    if(thisRoom.Neighbor[(int)west]!=NULL)
        output<<"w\t";
    if(thisRoom.Neighbor[(int)south]!=NULL)
        output<<"s\t";
    if(thisRoom.Neighbor[(int)north]!=NULL)
        output<<"n\t";
    output<<"\nEnter the direction:Q for quit";
    return output;
}

int main() {
    Room r;
    std::cout << r;
    return 0;
}[/code]

程序输出:
You are in
You can move to:
Enter the direction:Q for quit请按任意键继续. . .

编译工具:
Visual C++ Express 2008 SP1

4 楼

description肯定是string的没问题。奇怪就奇怪在用VS2008就会挂掉,用dev c++编就啥事都没有- -

5 楼

看看类中有没有存在隐式转换代码,或者直接禁了隐式,看看还会不会发生此情况,

这些特定编译器中的BUG知道个大概就可以,没必要这么在意,

就像我以前遇到的VC6的BUG这样,是很郁闷,不过我们还是得依赖编译器,我们只能适应它。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
 

class a
{
public:
    a():width(0),height(0){}
    ~a(){}
    void create(int width,int height,int imx);
    int width;
    int height;
    int mx;
};

void a::create(int width,int height,int imx)
{
    width=width;
    height=height;
    mx=imx;
}

class b
{
public:
    b():l(0){}
    ~b(){}
    void release(){ if(l!=0) delete  l;}
    void create(int width,int height,int imx);
private:
     a     *l;
};
void b::create(int width,int height,int imx)
{
      l=new a;
      l->create(width,height,imx);
      cout<<"l->width="<<l->width<<endl;
      cout<<"l->height="<<l->height<<endl;
      cout<<"l->mx="<<l->mx<<endl;
}

int main()
{
   b d;
   d.create(100,200,300);
    
    return 0;
}

运行结果领人结舌:
l->width=0
l->height=0
l->mx=300
Press any key to continue

6 楼

re peige:

    width=width;
    height=height;
这个不能算是VC的bug吧,应该写成
    this->width=width;
    this->height=height;

7 楼

顶bt哥,不然方法怎么知道哪个width是属性,哪个是外部变量?指代不明了

8 楼

我承认是本人的习惯不好;

但又有多少人会在设计类中,每个成员都套一个this->下去呢,偶尔没有加上this是很正常的事,我只是想说明VC6存在这种缺陷,而我称之为BUG

PS:我好像以前也把这段代码放别的编译器(如DEV CPP),次编译器好像就能侦测出来,

9 楼

同名对象的作用域解析貌似结果是由编译器决定的吧。不写明无疑不是一个好习惯

我来回复

您尚未登录,请登录后再回复。点此登录或注册