由于const,无法在构造函数中转换参数

时间:2015-09-17 10:53:15

标签: c++ constructor const-cast

在我的软件中,我有一个三角形和一个包含三角形的页面。我想构建一个页面,给它一个三角形加上其他数据。

class Triangle
{
public:
    const int **m_apVertex;
    Triangle(const int * apVertex[])
    {
        m_apVertex=apVertex;
    }
};

struct args
{
    int ** vertices;
    // ... other data
};

class Page
{
public:
    Triangle m_t;

    Page(const args conArgs):
        //m_t(const_cast<const INT **>(conArgs.vertices))
        m_t(conArgs.vertices)
    {
    }
};

void main()
{
    args a;
    Page p(a);
}

编译失败:

error C2664: 'Triangle::Triangle(const int *[])' : cannot convert parameter 1 from 'int **const ' to 'const int *[]'

作为修复,我使用m_t(const_cast<const INT **>(conArgs.vertices)),但我不确定为什么没有const_cast就无法工作;

1 个答案:

答案 0 :(得分:0)

改变就足够了:

const int **m_apVertex;
Triangle(const int * apVertex[])

 int **m_apVertex;
Triangle( int * apVertex[])

或者如果您不想触摸它,请更改:

struct args
{
    int ** vertices;

struct args
{
    const int ** vertices;

其他一些信息:

const int **m_apVertex;
^^^^^~~ this const is known as low-level const

const int ** const apVertex
             ^^^^^~~ this const is known as top-level const

顶级const用于表示指针(整个对象)本身是一个const。如果指针指向的对象是const,那么我们称之为低级const。

现在,当我们复制一个对象时,顶级的consts会被忽略,所以下面是有效的:

void foo(int* pi) {}
int main() {
    int* const pi=0;
    foo(pi);
}

与你的情况相同。但是低级const永远不会被忽略,所以你不能这样做:

const int ** cvertices;
int ** vertices;
vertices = cvertices;