修改
很抱歉,我正在尝试了解使用QList::indexOf
方法的代码示例,该代码在here中声明。
实际上我想弄清楚为什么我需要在这个特定情况下使用const_cast
:
int ProjTreeItem::row() const
{
if (parentItem) {
// instance of const object to test
const ProjTreeItem *item = new ProjTreeItem(QList<QVariant>(), NULL);
// Called indexOf here to test
parentItem->childItems.indexOf(item);
// This works fine
return parentItem->childItems.indexOf(const_cast<ProjTreeItem*>(this));
}
return 0;
}
EDIT2:
我正在寻找错误的地方,然后我开始怀疑这个问题与使用模板和const
修饰符有关。我找到了这个帖子here。请看Jon的回答,我想这一点澄清了我的意见。对不起我的问题误导。
答案 0 :(得分:3)
我想你想要这个:
void SomeClass::f(const MyClass*) const
{ ... }
答案 1 :(得分:2)
嗯,这段代码对我有用:
class MyClass
{
};
class SomeClass
{
public:
void f(const MyClass *t) const
{
}
};
int main()
{
SomeClass s;
const MyClass *myClass = new MyClass;
MyClass *myClass2 = new MyClass;
s.f(myClass);
s.f(myClass2);
return 0;
}
答案 2 :(得分:1)
您错误地假设item
的类型等于this
的类型,我相信这让您感到困惑。
在const
函数中,this
的类型为ProjTreeItem const * const item
。但是你的指针是const ProjTreeItem * item
:
// `this` is a constant-pointer-to-a-constant-ProjTreeItem
ProjTreeItem const * const this; // obviously not valid code, just illustrating type
// `item` is simply a pointer-to-a-constant-ProjTreeItem
const ProjTreeItem * item;
从右到左阅读声明是有帮助的。
所以,声明你这样的项目指针,我怀疑你也需要一个演员。
const ProjTreeItem * const item = new ProjTreeItem(QList<QVariant>(), NULL);
答案 3 :(得分:0)
我认为你的意思是
parentItem->childItems.indexOf(item);
无法编译。 我还假设你写了
QList< ProjTreeItem* > childItems;
在parentItem
的类型(类)定义中
如果我理解正确,在行
parentItem->childItems.indexOf(item)
您要将ProjTreeItem const*
转换为ProjTreeItem*
,并且
这需要const_cast
JaredC已经对constness表示友善。
我建议再仔细阅读他的答案。
修改强>
我认为乔恩的回答适用于你的问题
QList::indexOf
的第一个参数是T const&
,其中T是ProjTreeItem*
在你的情况下。
因此,具体参数类型为ProjTreeItem*const&
请注意,它与ProjTreeItem const*const&
不同
ProjTreeItem*
和ProjTreeItem const*
是不同的类型
从后者转换为前者需要const_cast
ProjTreeItem const*
表示ProjTreeItem
为const
但是,ProjTreeItem*const&
表示指针为const
,ProjTreeItem
不 const
。
<强> EDIT2 强>:
你似乎误解了。
#include <typeinfo>
#include <iostream>
using namespace std;
struct ProjTreeItem;
template< class T >
struct Test {
typedef T const type;
};
int main()
{
cout<< boolalpha;
cout<<
(typeid( Test< ProjTreeItem* >::type ) == typeid( ProjTreeItem const* ))
<<endl;
cout<<
(typeid( Test< ProjTreeItem* >::type ) == typeid( ProjTreeItem*const ))
<<endl;
}
如果您的解释是正确的,上面的代码将打印true
,
然后false
。
但是,代码会打印false
,然后打印true
。