拥有这组对象和语句:
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
我会收到"从'const foo*'到'foo* const&amp;"的错误"没有已知的参数转换。"。我想我很难阅读这些类型,因为我不知道我该怎么做才能完成这项工作。
从我阅读的内容中,const关键字适用于左侧的类型,除了可以写在其适用类型的左侧的顶级const以外。我的猜测是我必须将get()转换为参考,但我不确定如何做。
这里似乎有几个误解(无论是由发问者还是通过某些答案)。
首先,您说:"我的猜测是我必须将get()
转换为参考,但我不确定如何做到这一点"。让我们尝试清除此问题:
1)"我必须将get()
转换为参考" - 实际上,您不!
iterator QSet::insert(const T & value)
确实确实进行了参考。但这是对T
类型的引用。因此,问题是"什么是类型T
"?
在这种情况下,T=Foo *
。因此,在模板的这种情况下,insert
实际上是:
iterator QSet::insert(Foo * const & value)
-从右到左阅读:insert
参考Foo
的常数指针。
2)"我不确定如何[将指针转换为参考]" - 虽然您不必在这里这样做,但总的来说,您可以通过删除GET的结果来做到这一点。例如:*(get())
。
第二,编译器错误。由于存在冲突而出现错误:
a)get()
返回const Foo *
b)但是set
存储Foo*
-不是const Foo *
,因此insert
仅接受可变的Foo
因此,您无法在QSet<Foo*>
中存储恒定的指针。这是有道理的,因为您可以使用set
访问和更改其中的Foo
s,您保证不使用const Foo
。
此参考应有所帮助:
https://isocpp.org/wiki/faq/const-correctness
您还可以认为您是否只能使用QSet<Foo>
而不是QSet<Foo*>
。在前一种情况下,事情可能会表现出您的期望。
您正在尝试使用const Foo *
并将其插入QSet<Foo *>
,但是编译器不会自动将const Foo *
转换为普通Foo *
。/div>
我通过更改集的类型如下解决了问题。
QSet<Foo const*> set;
随着这种更改,汇编成功。
您违反了从get()
函数返回的指针的恒定。get()
将指针返回到类型Foo
的const对象,但随后您尝试将其插入非CONST Foo
指针的向量中。您需要const_cast
从get()
返回值,或将get()
的返回类型从const Foo*
更改为Foo*
。