拥有这组对象和陈述:
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
我得到错误“没有已知的转换参数1从'const Foo *'到'Foo * const&amp;”。我想我在阅读这些类型时遇到了麻烦,因为我不知道应该怎样做才能使这项工作。
根据我的阅读,const关键字适用于其左侧的类型,顶级const除外,它可以写入它应用的类型的左侧。我的猜测是我必须将get()转换为引用,但我不确定该怎么做。
答案 0 :(得分:7)
这里似乎存在一些误解(提问者和一些答案)。
首先,您说“我的猜测是我必须将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
,您承诺不会使用const Foo
。
此参考应该有所帮助:
https://isocpp.org/wiki/faq/const-correctness
您也可以考虑是否可以使用QSet<Foo>
代替QSet<Foo*>
。在前一种情况下,事情可能会表现出你的期望。
答案 1 :(得分:5)
您尝试使用const Foo *
并将其插入QSet<Foo *>
,但编译器不会自动将const Foo *
转换为普通Foo *
以便这样做。
答案 2 :(得分:3)
我通过更改集的类型解决了这个问题,如下所示。
QSet<Foo const*> set;
通过此更改,编译成功。
答案 3 :(得分:3)
您违反了get()
函数返回的指针的常量。 get()
返回指向类型为Foo
的const对象的指针,但是您尝试将其插入到非常量Foo
指针的向量中。您需要const_cast
get()
的返回值,或将get()
的返回类型从const Foo*
更改为Foo*
。