2015-09-17 2 views
2

В моем программном обеспечении у меня есть треугольник, а страница содержит треугольник. Я хочу построить страницу, дающую ей треугольник плюс другие данные.Невозможно преобразовать параметр в конструктор из-за 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;

+1

Поскольку вы передаете аргумент 'Page' конструктора с помощью' const', что делает 'conArgs.vertices' константа, которая отличается от массив указателей на константные целые числа (или не постоянный указатель (по мере того, как массивы распадаются на указатели) на указатели на постоянные целые числа). 'const int **' не совпадает с 'int ** const'. –

+0

Таким образом, модификатор const в 'const args conArgs' в конструкторе страницы делает' conArgs.vertices'' типа 'int ** const' –

+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, тогда мы называем его low-level const.

Теперь, когда мы копируем объект, consts верхнего уровня игнорируются, поэтому ниже действует:

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

же, как в вашем случае. Но низкоуровневый Const никогда не игнорируется, так что вы не можете сделать это:

const int ** cvertices; 
int ** vertices; 
vertices = cvertices; 
Смежные вопросы