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

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()转换为引用,但我不确定如何做到这一点.

Cor*_*rey 7

这里似乎有一些误解(提问者和一些答案).

首先,你说"我的猜测是我必须转换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*>.在前一种情况下,事情可能会表现出你的期望.

  • 我不认为你可以使用这样的括号.g ++给了我一个编译器错误.如果没有括号,`const int**pcp`将是指向常量`int`的可变指针的可变指针,而`int*const*pcp`将是指向可更改`int`的常量指针的可更改指针. . (2认同)

Gre*_*ill 5

您正在尝试const Foo *将其插入到a中QSet<Foo *>,但编译器不会自动将其转换const Foo *为plain Foo *以执行此操作.