c ++()运算符问题

时间:2009-12-20 17:49:49

标签: c++ operator-overloading

尝试重载数组访问的()运算符时,我遇到了另一个问题:

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;

4 个答案:

答案 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()

因为没有多少点返回对常量指针的引用,你不能修改指针,引用将(可能)与指针的大小相同。