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

Posted

技术标签:

【中文标题】C++ 中的类型转换和引用【英文标题】:typecasting and reference in c++ 【发布时间】:2011-12-14 21:54:11 【问题描述】:

请看下面的调用和对应的函数,

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);

这个问题怎么解决??

【问题讨论】:

你已经解决了如何传递引用的问题。不过,这个实现可能还有其他问题 ;-) 等等,那你为什么不想创建一个变量呢?这是你能做到的唯一方法;它不会像现在一样工作,只需要一个演员表。 (如果函数不需要修改char*,请参见Oli的回答,在这种情况下您不需要创建变量) 这里的问题是:WRT char 这个函数有什么作用?这个函数真的需要Node *&吗?你能解决它吗? 【参考方案1】:

您不能传递对 temporary 右值的引用(感谢奇怪的家伙)。您必须创建一个变量并传递它:

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

【讨论】:

或改变 Oli 观察到的函数。 您不能将 非常量 引用传递给临时对象。已修复。 @Griwes 引用是非常量引用。 @SethCarnegie:但您可以传递 const 引用 - 而且,从您的回答中,OP 可以读到“我无法将任何类型的引用传递给临时对象”。 技术端节点:"temporary" 其实这里没有临时的!【参考方案2】:

您不能将非const 引用绑定到临时对象。 (char *)newNode 的结果是临时的(它没有名字)。

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

【讨论】:

虽然,通过引用传递它的目的可能是为了修改它,因此将其设为 const 可能会破坏目的。 技术侧节点:“您不能将非常量引用绑定到临时对象”实际上,这里没有临时对象! @curiousguy:那么演员阵容的结果是什么? @OliCharlesworth “临时”是形容词,这里隐含的名词是“对象”。这里没有对象。 "什么是强制转换的结果," 一个右值。【参考方案3】:

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

writePage(long &pageNumber, Node* &node)

毕竟,您不希望您的Node 指针newNode 指向根本不是Node 实例的东西,因为它被任意chars 覆盖。你呢?

【讨论】:

以上是关于C++ 中的类型转换和引用的主要内容,如果未能解决你的问题,请参考以下文章

C++强制类型转换

c++转换构造函数和类型转换函数

C++ 中的类型转换和指针类型转换

C++: 四种强制类型转换

C++ 中的类型转换/铸造混淆

C++中的类型转换