在我的软件中,我有一个三角形和一个包含三角形的页面。我想构建一个页面,给它一个三角形加上其他数据。
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就无法工作;
答案 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;