[英]Strange char* compile error?
我的代码下面有什么问题吗? 我得到了编译错误!
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;
}
提前谢谢,乔治
将BYTE*
为char*
,将使用char*
类型创建未命名的临时实体。 您调用的函数接受char*
的引用,但您不能引用这样的临时实体,因为它不是真正的变量。
您可以执行reinterpret_cast<char*&>
而不是静态强制转换
foo (reinterpret_cast<char*&>(buffer));
或者,您可以使参数成为const引用:
void foo(char* const & p)
{
return;
}
foo的参数是对指针的引用。 buffer是一个BYTE指针。 参考需要完全匹配,分配兼容不会。
两种解决方案
1)你可能不需要p前面的'&'。 松开它,代码将编译。
2)使用正确类型的变量,以便引用可以工作:
BYTE * buffer;
char * b = (char *) buffer;
foo (b);
buffer = (BYTE*) b; // because foo may change b
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中使用引用。 这是一个很长的阅读,但非常值得。
您正在尝试传递变量引用,但是没有可以引用的char *类型的变量。
如果我没记错的话应该这样工作:
BYTE * buffer;
char* ptr = (char*)buffer;
foo(ptr); // now you have a matching variable to refer to.
也许传递一个值而不是一个引用会更容易。
首先,当你说
(char)buffer
你在骗编译器 - 缓冲区是指针,而不是char。
其次,即使转换工作,它也会产生一个临时的,不能绑定到非const引用。
所以,是的,您的代码至少有两个问题。
写这样:
int main() {
BYTE * buffer;
char* pbuf = (char*)buffer;
foo(pbuf);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.