不了解C++类型不匹配:const Foo* to Foo* 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

我会收到"从'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_castget()返回值,或将get()的返回类型从const Foo*更改为Foo*

最新更新