奇怪的char *编译错误?

时间:2009-02-15 18:27:46

标签: c++ reference 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;
}

提前致谢, 乔治

7 个答案:

答案 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);
}