2014-11-02 60 views
0

常量指针我有C++代码,当我编译我收到以下错误信息:C++:错误传递的const引用

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 '是不同的类型 – 2014-11-02 16:48:03

+3

Holy [常量正确性](http://www.parashift.com/c++-faq/const-correctness.html)蝙蝠侠。 – 2014-11-02 16:48:56

+0

这是什么意思?我应该怎么做才能使用正确的类型传递参数? – SomethingSomething 2014-11-02 16:48:59

回答

0

也许你需要澄清const的用法。 foo* const A声明一个foo类型的对象并创建一个指向该对象的常量指针。该对象可以改变,但不是指针。 const foo*创建一个指向常量对象的指针。对象foo不可修改。

您试图将一个常量指针传递给一个可编辑对象列表到一个函数,该函数需要一个指向常量对象列表的指针。你看到这会导致问题吗?函数内的用法与创建传递对象时设置的条件不匹配。

您可以将常规指针传递给需要常量指针的函数。这种转换是OK,即

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关键字。他们仅仅使用这个对象,但绝不管理它。