C++ 不理解C++;类型不匹配:常量Foo*到Foo*常量&;

C++ 不理解C++;类型不匹配:常量Foo*到Foo*常量&;,c++,pointers,reference,constants,C++,Pointers,Reference,Constants,拥有这组对象和语句: 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());

拥有这组对象和语句:

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
QSet集;
迭代器QSet::insert(const T&value)//我要调用的函数的类型
const Foo*get()const//用于获取参数的函数的类型
set.insert(get())//显示为错误的行
我得到错误“参数1从'const Foo*'到'Foo*const&'的转换未知”。我想我在阅读这些类型的文章时遇到了困难,因为我不知道我应该做些什么来让它起作用


从我所读到的内容来看,const关键字应用于左边的类型,但顶层const除外,它可以写入它所应用的类型的左边。我的猜测是,我必须将get()转换为引用,但我不确定如何进行转换。

您正在尝试获取一个
常量Foo*
,并将其插入
QSet
,但编译器不会自动将
const Foo*
转换为普通
Foo*

我通过更改集合的类型解决了此问题,如下所示

QSet<Foo const*> set;
QSet集;

通过此更改,编译成功。

您违反了从
get()
函数返回的指针的常量
get()
返回一个指向类型为
Foo
的常量对象的指针,然后尝试将其插入到非常量
Foo
指针的向量中。您需要
const\u cast
get()
返回值,或者将
get()
的返回类型从
const Foo*
更改为只
Foo*

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

首先,您说“我想我必须将
get()
转换为引用,但我不确定如何转换”。让我们试着澄清一下:

1) “我必须将
get()
转换为引用”--实际上,你不需要

迭代器QSet::insert(const T&value)
确实需要引用。但它是对类型
T
的引用。所以问题是,“什么是类型
T

在这种情况下,
T=Foo*
。因此,在此模板实例中,
insert
,实际上是:

迭代器QSet::insert(Foo*const&value)
从右到左读取:
insert
引用指向
Foo
的常量指针

2) “我不确定如何做[将指针转换为引用]”——虽然您不必在此处执行此操作,但通常可以通过取消引用get的结果来执行此操作。例如:
*(get())

第二个,编译器错误。出现错误是因为存在冲突:

a)
get()
返回一个
const Foo*

b) 但是
set
存储
Foo*
——而不是
const Foo*
,因此
insert
只接受可更改的
Foo

因此,您不能在
QSet
中存储常量指针。这是有意义的,因为您可以使用
set
访问和更改其中的
Foo
s,您承诺不使用
const Foo

此参考资料应有助于:


您还可以考虑是否可以使用
QSet
而不是
QSet
。在前一种情况下,事情可能会按照您期望的方式进行。

这不是“顶级
常量”
get()
返回指向“
const-Foo
”的指针,而不是
const
指针。因此,我认为
const
在开始时适用于其右边的所有对象的理解是错误的?这样的
const
到底适用于什么?这可能是另外两种选择。@jeffrey:因为
QSet
包含非常量指针。您不能将指向const的指针隐式更改为指向nonconst的指针。请看,
const X*
对于任意复杂的类型构造
X
,是否等同于
X const*
?这是当
X
是一个类型时-
X
更复杂时不是这样的。。事实上,这就是为什么我必须在替换
T
之前进行交换。写入
X常量*
可以更容易地从右向左读取(“指向常量的指针
X
)。但是写入
const X*
可以在源代码中更明显地看到类型是“a常量
X
“。所以通常您会在代码中看到它
const X*
。对于模板,它可能会让人困惑,所以。。。任何编写
QSet
的人都可以编写
insert(const T&value)
insert(T const&value)
,他们应该是相同的。但那是因为编译器知道该做什么。如果你想在纸上或头脑中用in代替
T
,在进行替换之前,你必须把它看作
insert(T const&value)
。那么
const(int*)*pcp
就是指向int的常量指针吗?或者这是一个无效的案例?我不认为你可以像那样使用括号。g++给了我一个编译器错误。如果没有括号,
const int**pcp
将是指向常数的可变指针
int
,而
int*const*pcp
将是指向可变
int
的可变指针。