2010-04-13 56 views
0

我有一个包含所有列举的枚举的头文件(#ifndef #define #endif构造已用于避免多个包含文件),我在我的应用程序中使用了多个cpp文件。这些文件中的枚举的是将枚举传递给C++中的函数

enum StatusSubsystem {ENABLED,INCORRECT_FRAME,INVALID_DATA,DISABLED}; 

还有时,我调用上面的函数一样

delcared作为

ShowStatus(const StatusSubsystem&); 

在应用较早的应用功能

我的应用程序用于完美编译。但是,加入一些代码后,编译暂停给予以下错误:

File.cpp:71: error: invalid conversion from `int' to `StatusSubsystem' 
File.cpp:71: error: initializing argument 1 of `void Class::ShowStatus(const StatusSubsystem&) 

我检查的代码,任何冲突枚举在新的代码,它看起来很好。

我的问题是编译器显示为错误的函数调用有什么问题?

供您参考函数的定义是:

void Class::ShowStatus(const StatusSubsystem& eStatus) 
{ 

    QPalette palette; 
    mStatus=eStatus;//store current Communication status of system 
    if(eStatus==DISABLED) 
    { 
    //select red color for label, if it is to be shown disabled 
    palette.setColor(QPalette::Window,QColor(Qt::red)); 
    mLabel->setText("SYSTEM"); 

    } 
    else if(eStatus==ENABLED) 
    { 
     //select green color for label,if it is to be shown enabled 
     palette.setColor(QPalette::Window,QColor(Qt::green)); 
    mLabel->setText("SYSTEM"); 

    } 
    else if(eStatus==INCORRECT_FRAME) 
    { 
     //select yellow color for label,to show that it is sending incorrect frames 
     palette.setColor(QPalette::Window,QColor(Qt::yellow)); 
     mLabel->setText("SYSTEM(I)"); 

    } 
    //Set the color on the Label 
    mLabel->setPalette(palette); 
} 

的这种情况的一个奇怪的副作用是编译的时候是我投的所有调用ShowStatus()作为

ShowStatus((StatusSubsystem)INCORRECT_FRAME); 

虽然这消除任何编译错误,但会发生一件奇怪的事情。尽管我在上面调用了INCORRECT_FRAME,但是在函数定义中它与ENABLED匹配。这究竟有多可能?它就像通过引用传递INCORRECT_FRAME一样,它神奇地转换为ENABLED,这应该是不可能的。这让我疯狂。

你能在我的工作中发现任何缺陷吗?或者是别的什么?

该应用程序是在RHEL4上使用C++ Qt-4.2.1编写的。

谢谢。

回答

6

您应该按值取enum,而不是const引用。它足够小以适应int,所以不存在性能损失或任何类似的情况。

但是,从您所描述的情况来看,这听起来像有人在其他地方有#define d INCORRECT_FRAME到0。你应该把类似下面的一行上面:

#ifdef INCORRECT_FRAME 
#error Whoops, INCORRECT_FRAME already defined! 
#endif 

顺便说一句,在#ifndef啄(你的头文件)被称为include guard。 :-)

+0

+1,但我相信通过const引用接受应该仍然有效。但如果能解决这个问题,我不会感到惊讶。谁知道GCC在RHEL4上的年龄? – rlbond 2010-04-13 05:25:21

+0

@rlbond:我认为const引用也可以工作......请参阅OP有关它有时如何工作,有时不工作的评论。这就是我后来相信一些其他代码'#define''INCORRECT_FRAME'的新值。 – 2010-04-13 05:28:52

+0

@ribond,RHEL 4上的gcc版本是3.4.3 :) – rocknroll 2010-04-13 05:30:52

相关问题