2009-02-15 172 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中引用。这是一个很长的阅读,但非常值得。