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
的可变指针。