C ++:传递const引用的const指针时出错

时间:2014-11-02 16:46:08

标签: 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);
        }       
    }
}

请帮忙

谢谢!

1 个答案:

答案 0 :(得分:0)

也许您需要澄清const的用法。 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);的使用是恕我直言的良好做法,表示函数func不会被删除,管理内存或重新分配指针。这就是许多微软API调用使用const关键字的原因。他们只是使用对象,但绝不管理它。