我的代码有什么问题吗?我收到了编译错误!
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 :(得分:14)
当您将BYTE*
强制转换为char*
时,会使用类型char*
创建一个未命名的临时实体。您调用的函数引用char*
,但您不能引用这样的临时实体,因为它不是真正的变量。
答案 1 :(得分:7)
您可以执行reinterpret_cast<char*&>
而非静态投射
foo (reinterpret_cast<char*&>(buffer));
或者,您可以将参数设为const引用:
void foo(char* const & p)
{
return;
}
答案 2 :(得分:4)
foo的参数是对指针的引用。 buffer是一个BYTE指针。参考需要完全匹配,分配兼容不会。
两种解决方案:
1)你可能不需要'&amp;'在p。面前松开它,代码将编译。
2)使用正确类型的变量,以便引用起作用:
BYTE * buffer;
char * b = (char *) buffer;
foo (b);
buffer = (BYTE*) b; // because foo may change b
答案 3 :(得分:2)
buffer
指针是一个“左值”,但是当对其应用强制转换操作时,表达式为:
(char*) buffer
是一个“rvalue”(实际上是一个“可修改的rvalue” - 但我认为这只适用于即将推出的C ++ 0x)。非const引用不能绑定到rvalues。
但是, const 引用可以绑定到rvalues。因此,对程序的以下修改将编译:
void foo(char* const& p) // added 'const'
Stephan T. Lavavej最近发布了一篇博客文章,其中包含关于左值,右值和参考的详细信息:
这篇文章实际上是关于C ++ 0x中新的“右值引用”,但它很好地解释了左值和右值是什么以及它们如何能够和不能在C ++ 98中使用引用。这是一个很长的阅读,但非常值得。
答案 4 :(得分:1)
您正在尝试传递变量引用,但是没有可以引用的char *类型的变量。
如果我没记错的话,这应该是这样的:
BYTE * buffer;
char* ptr = (char*)buffer;
foo(ptr); // now you have a matching variable to refer to.
也许传递一个值而不是一个引用会更容易。
答案 5 :(得分:1)
首先,当你说
时(char)buffer
你对编译器撒谎 - 缓冲区是指针,而不是char。
其次,即使转换工作,它也会产生一个临时的,不能绑定到非const引用。
所以,是的,您的代码至少有两个问题。
答案 6 :(得分:1)
像这样写:
int main() {
BYTE * buffer;
char* pbuf = (char*)buffer;
foo(pbuf);
}