c ++中的类型转换和引用

时间:2011-12-14 21:54:12

标签: c++ casting lvalue rvalue

请查看以下电话和相应的功能

long pagenumber = 0;
Node *newNode = createNode();
bufMgr->writePage(pageNumber,(char*)newNode);

和writePage声明如下

writePage(long &pageNumber,char* &node)

writePage接受长引用和char *引用。 以上不编译,它显示以下错误

no matching function for call to ‘SampleBufferManager::writePage(long int&, char*)’
SampleBufferManager.h:28: note: candidates are: bool SampleBufferManager::writePage(long int&, char*&)

任何人都可以帮助我,如何处理这个...类型转换正在解决问题,如果我按以下方式执行代码编译:

long pagenumber = 0;
Node *newNode = createNode();
char *test = (char*)newNode;
bufMgr->writePage(pageNumber,test);

问题怎么解决?

3 个答案:

答案 0 :(得分:3)

您无法将引用传递给临时 rvalue(感谢curiousguy)。你必须创建一个变量并传递它:

char* c = (char*)newNode;
bufMgr->writePage(pageNumber, c);

答案 1 :(得分:2)

您无法将非const引用绑定到临时引用。 (char *)newNode的结果是临时的(它没有名称)。

但是,您可以将const引用绑定到临时引用。因此,将您的函数重新声明为writePage(long &pageNumber, char* const &node)将起作用。

答案 2 :(得分:1)

writePage做什么?你是否也掌控了这个功能?如果第二个参数没有写入此地址,则将第二个参数重新声明为const可能会有所帮助。如果它确实 - 它的名字暗示某种方式 - 无论如何在其中使用Node*可能是合理的,即声明为

writePage(long &pageNumber, Node* &node)

毕竟,您不希望您的Node指针newNode完全指向不是Node实例的内容,因为它被任意{char覆盖1}}秒。你呢?