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
实例的东西,因为它被任意char
s 覆盖。你呢?
【讨论】:
以上是关于C++ 中的类型转换和引用的主要内容,如果未能解决你的问题,请参考以下文章