繁体   English   中英

奇怪的char *编译错误?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM