Bal*_*nat 8 c++ pointers const reference
拥有这组对象和语句:
QSet<Foo*> set;
iterator QSet::insert(const T & value) //type of the function I want to call
const Foo * get() const //type of the function I use to get the argument
set.insert(get()); //the line showing up as error
Run Code Online (Sandbox Code Playgroud)
我得到错误"没有已知的转换参数1从'const Foo*'到'Foo*const&".我想我在阅读这些类型时遇到了麻烦,因为我不知道应该怎么做才能使这项工作成功.
根据我的阅读,const关键字适用于其左侧的类型,顶级const除外,它可以写入它应用的类型的左侧.我的猜测是我必须将get()转换为引用,但我不确定如何做到这一点.
这里似乎有一些误解(提问者和一些答案).
首先,你说"我的猜测是我必须转换get()为参考,但我不确定该怎么做".我们试着清除它:
1)"我必须转换get()为参考" - 实际上,你没有!
iterator QSet::insert(const T & value)确实需要参考.但它是对类型的引用T.所以问题是"什么是类型T"?
在这种情况下,T=Foo *.所以insert,在这个模板的例子中,实际上是:
iterator QSet::insert(Foo * const & value)- 从右到左阅读:insert引用一个指向a的常量指针Foo.
2)"我不确定如何做到[将指针转换为引用]" - 虽然你不必在这里做,但一般来说你通过取消引用get的结果来做到这一点.例如:*(get()).
二,编译错误.出现错误是因为存在冲突:
a)get()返回aconst Foo *
b)但是set存储a Foo*- 不是a const Foo *,所以insert只接受可更改的Foo
所以你不能在你的内部存储一个常量指针QSet<Foo*>.这是有道理的,因为您可以使用它set来访问和更改Foo它内部的s,您保证不会使用它const Foo.
这个参考应该是有帮助的:
https://isocpp.org/wiki/faq/const-correctness
您也可以考虑是否可以使用a QSet<Foo>而不是a QSet<Foo*>.在前一种情况下,事情可能会表现出你的期望.
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |