2014-11-02 2 views
0

У меня есть C++ кода, что, когда я скомпилировать его я получаю следующее сообщение об ошибке:C++: Ошибка прохождение константного указателя константной ссылки

error: no matching function for call to ‘DataSourceScheme::initObject(const QString&, const QString&, QVector<ColumnScheme*>* const&)’ 
    initObject(datasourcescheme.name_, datasourcescheme.cmd_, datasourcescheme.columns_); 

note: no known conversion for argument 3 from ‘QVector<ColumnScheme*>* const’ to ‘const QVector<const ColumnScheme*>* 

код C++:

DataSourceScheme::DataSourceScheme(const DataSourceScheme &datasourcescheme) { 
    initObject(datasourcescheme.name_, datasourcescheme.cmd_, datasourcescheme.columns_); 
} 

void DataSourceScheme::initObject(const QString &name, const QString &cmd, const QVector<const ColumnScheme*> *columns) { 
    name_ = name; 
    cmd_ = cmd; 
    columns_ = new QVector<ColumnScheme*>(); 
    if (columns != NULL) { 
     for (const ColumnScheme *column : *columns) { 
      addColumn(*column); 
     }  
    } 
} 

Пожалуйста, помогите

Спасибо!

+3

'QVector ' и 'QVector ' являются различными типами –

+3

Holy [const correctness] (http://www.parashift.com/c++-faq/const-correctness.html) batman , –

+0

Что это значит? Что мне делать, чтобы передать параметр с правильным типом? – SomethingSomething

ответ

0

Возможно, вам понадобится разъяснение об использовании константы. foo* const A объявляет объект типа foo и создает постоянный указатель на этот объект. Объект можно изменить, но не указатель. const foo* создает указатель на постоянный объект. Объект foo не модифицируется.

Вы пытаетесь передать постоянный указатель на список редактируемых объектов функции, которая требует указателя на список постоянных объектов. Вы видите, что это приводит к проблемам? Использование внутри функции не соответствует критериям, установленным при создании передаваемых объектов.

Вы можете передать нормальный указатель на функцию, требующую постоянного указателя. Это преобразование в порядке, то есть

void func(foo* const param); // Function declaration   
    foo* A; 
    func(A); // Function call OK 

Кроме того,

void func(foo* const param); // Function declaration   
    foo* const A; 
    func(A); // Function call OK 

Вы не можете передать указатель на константный объект к функции, требующей нормальный указатель. Это преобразование в норме, то есть

void func(foo* param); // Function declaration   
    const foo* A; 
    func(A); // Error 

Я добавлю боковое примечание. Использование void func(foo* const param); является хорошей практикой IMHO, чтобы показать, что функция func не должна удалять, управлять памятью или переназначать указатель. Вот почему многие вызовы API Microsoft используют ключевое слово const. Они просто используют объект, но никак не справляются с этим.

Смежные вопросы