2009-02-15 120 views
3

下面我的代碼有問題嗎?我得到了編譯錯誤!奇怪的char *編譯錯誤?

typedef unsigned char BYTE; 

void foo(char* & p) 
{ 
return; 
} 

int main() 
{ 
    BYTE * buffer; 
    // error C2664: 'foo' : cannot convert parameter 1 from 'char *' to 'char *&' 
    foo ((char*)buffer); 

    return 0; 
} 

由於提前,喬治

+0

我認爲ChrisW實際上在編輯時修正了您的代碼中的錯誤...您將BYTE *轉換爲(char)而不是(char *)。 – UncleZeiv 2009-02-15 18:35:27

+0

不是這樣,你不能通過非const引用臨時傳遞,所以錯誤仍然存​​在:轉換創建一個臨時的,並且不能通過引用傳遞。 – 2009-02-15 18:47:48

+0

@UncleZeiv編輯歷史記錄說我做過,但我不記得那樣做。我無法解釋它。它可能是別人,即使是OP,做了一個併發編輯? – ChrisW 2009-02-15 18:58:38

回答

14

當你施放的BYTE*char*一個無名臨時實體與類型char*創建。您調用的函數引用char*,但不能引用此類臨時實體,因爲它不是實際變量。

+0

你能告訴我你是如何修復它的嗎? – George2 2009-02-15 18:39:42

+0

我不確定這是什麼......它是一個指針,你只是告訴編譯器相信你......我很確定這裏沒有臨時的參與。 – UncleZeiv 2009-02-15 18:41:58

1

您正在嘗試傳遞一個變量引用,但是沒有可以引用的char *類型變量。

BYTE * buffer; 
char* ptr = (char*)buffer; 
foo(ptr); // now you have a matching variable to refer to. 

也許會更容易只是傳遞一個值,而不是一個參考:

,如果我沒記錯的話應該以這種方式工作。

1

首先,當你說

(char)buffer 

你在撒謊編譯器 - 緩衝區指針,而不是一個字符。其次,即使演員工作,它會產生一個臨時的,不能綁定到一個非const引用。

所以,是的,你的代碼至少有兩件事是錯誤的。

1

寫這樣的:

int main() { 
    BYTE * buffer; 
    char* pbuf = (char*)buffer; 
    foo(pbuf); 
} 
4

foo的參數是一個參考到一個指針。緩衝區是一個BYTE指針。參考需要完全匹配,分配兼容不會。

兩個解決方案:

1)你可能不會在P的前需要 '&'。鬆開它,代碼將被編譯。

2)使用正確類型的變量,因此基準將工作:

BYTE * buffer; 
char * b = (char *) buffer; 
foo (b); 
buffer = (BYTE*) b; // because foo may change b 
7

可以執行reinterpret_cast<char*&>而不是靜態澆鑄

foo (reinterpret_cast<char*&>(buffer)); 

或者,你可以爭論一個常量參考:

void foo(char* const & p) 
{ 
    return; 
} 
2

buffer指針是一個「左值」,bu噸當鑄造操作被施加到其時,表達式:

(char*) buffer 

是一個「右值」(實際上是「修改的右值」 - 但我認爲在即將到來的C++ 0x僅事項)。非常量引用不能綁定到右值。

但是,const引用可以綁定到右值。所以下面的修改你的程序將編譯:

void foo(char* const& p) // added 'const' 

斯蒂芬T. Lavavej最近發佈有關於左值,右值,並引用大量信息博客條目:

這篇文章實際上是關於C++ 0x中的新「右值引用」,但它很好地解釋了左值和右值是什麼以及它們如何能夠和不能在C++ 98中引用。這是一個很長的閱讀,但非常值得。