2010-04-13 120 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