由于 const,无法在构造函数中转换参数
Unable to convert parameter in constructor due to const
在我的软件中我有一个三角形,一个页面包含一个三角形。我想构建一个页面,给它一个三角形和其他数据。
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;
它就不能工作
改一下就够了:
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
top-level const用于表示指针(整个对象)本身是一个const。如果指针指向的对象是const,那么我们称它为低级const。
现在当我们复制一个对象时,顶级常量会被忽略,所以下面是有效的:
void foo(int* pi) {}
int main() {
int* const pi=0;
foo(pi);
}
与您的情况相同。但是低级常量永远不会被忽略,所以你不能这样做:
const int ** cvertices;
int ** vertices;
vertices = cvertices;
在我的软件中我有一个三角形,一个页面包含一个三角形。我想构建一个页面,给它一个三角形和其他数据。
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;
改一下就够了:
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
top-level const用于表示指针(整个对象)本身是一个const。如果指针指向的对象是const,那么我们称它为低级const。
现在当我们复制一个对象时,顶级常量会被忽略,所以下面是有效的:
void foo(int* pi) {}
int main() {
int* const pi=0;
foo(pi);
}
与您的情况相同。但是低级常量永远不会被忽略,所以你不能这样做:
const int ** cvertices;
int ** vertices;
vertices = cvertices;