尝试重载数组访问的()运算符时,我遇到了另一个问题:
const OctTreeNode*& operator()(const int i, const int j, const int k) const{
return m_cells[k*m_resSqr+j*m_res+i];
}
OctTreeNode*& operator()(const int i, const int j, const int k){
return m_cells[k*m_resSqr+j*m_res+i];
}
vector<OctTreeNode*> m_cells;
我得到了
C2440 'return': cannot convert from 'OctTreeNode *const' to 'const OctTreeNode *&'
这是什么交易?我正在宣布它与另一个班级完全相同。唯一的区别是另一个类是通用的,我正在使用T&amp;而不是OctreeNode *&amp;
答案 0 :(得分:2)
第一个运算符应返回const
const OctTreeNode * const & operator()(const int i, const int j, const int k) const{
return m_cells[k*m_resSqr+j*m_res+i];
}
...或*
之前的常量,我似乎永远不会记得-_-
第一个const告诉我们我们不能修改OctTreeNode,第二个告诉我们我们不能修改它的指针(例如将它设置为NULL),而第三个告诉我们方法不会改变对象。
老实说,我不确定是否需要第一个,因为我们需要授予const方法正确性的唯一方法是授予任何人不会更改对这些指针的引用。
答案 1 :(得分:1)
Kornel是对的。澄清const应该在*之前还是之后,之后。 const OctTreeNode * const &
和OctTreeNode const * const &
这两种类型相同,从右到左阅读时都很容易理解。
const OctTreeNode * const &
是对const的OctTreeNode的const点的引用。
OctTreeNode const * const &
是对const OctTreeNode的const指针的引用。
请注意,这些类型与无效类型const OctTreeNode const * &
不同。这将是对const的常量的OctTreeNode指针的引用。
注意句子的最后一部分 const constTreeNode是const 。其中一个const是多余的,这种类型是合法的,等同于const const OctTreeNode * &
答案 2 :(得分:0)
传递const值几乎没有意义,因为你正在使用i,j,k。
答案 3 :(得分:0)
常量运算符不正确,您将返回指向常量OctTreeNode的指针的非常量引用。
也就是说,如果将指针声明为
const int *a;
a
不是常数,a
指向是不变的。因此,当您将返回类型声明为
const OctTreeNode*&
OctTreeNode是常量,但指针不是。这是一个错误,因为你的成员函数是const,所以std :: vector是const,所以它返回的指针也是常量 - 最终你尝试将const指针作为非const指针返回。
要纠正此问题,请删除参考
const OctTreeNode* operator()
因为没有多少点返回对常量指针的引用,你不能修改指针,引用将(可能)与指针的大小相同。