不理解C ++类型不匹配:const Foo *到Foo * const&

时间:2015-05-05 02:02:28

标签: c++ pointers reference const

拥有这组对象和陈述:

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()转换为引用,但我不确定该怎么做。

4 个答案:

答案 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*