2014-12-01 4 views
3

Я поймаю ошибку и не знаю, как ее исправить. Я делаю селектор combobox для доступных SQLDrivers (поставщиков).Qt QList <T> casts and node_copy

Заголовок

#include "QObject" 
#include "QString" 
#include "QList" 
#include "QPointer" 

class TProvider; 
typedef const TProvider * const TProviderPointer; 

class TProvider 
{ 
    public: 
     QString name; 
     QString driverName; 

     TProvider(QString name, QString driverName); 
     static const QList<TProviderPointer> getAvailableProviders(); 
     static TProviderPointer getProvider(int id); 
}; 

TProviderPointer MySQLProvider = new TProvider("MySQL", "QMYSQL"); 
TProviderPointer IBProvider = new TProvider("Interbase", "QIBASE"); 

CPP. Здесь я создаю два константных указателя на const Providers (TProviderPointer) (перечисляя доступные драйверы). И у меня есть метод, который возвращает const QList.

#include "tprovider.h" 

TProvider::TProvider(QString name, QString driverName): 
    name(name), driverName(driverName) 
{ 
} 

const QList<TProviderPointer> TProvider::getAvailableProviders() 
{ 
    QList<TProviderPointer> list; 
    list.append(MySQLProvider); 
    list.append(IBProvider); 

    return list; 
} 

TProviderPointer getProvider(int id) 
{ 
    switch(id){ 
     case 0: 
      return MySQLProvider; 
     case 1: 
      return IBProvider; 
    } 
} 

, когда я использую этот

const QList<TProviderPointer> list = TProvider::getAvailableProviders(); 
foreach (TProviderPointer provider, list) { 
    ui->eprovider->addItem(provider->name); 
} 

я получаю и ошибки, указывающие на qlist.h и линии const QList<TProviderPointer> list = TProvider::getAvailableProviders(); -> C2440 TProviderPointer * к void * линии:

Q_INLINE_TEMPLATE void QList<T>::node_copy(Node *from, Node *to, Node *src) 

Есть ли у меня какие-либо копии работа в использовании? Как я могу это исправить? Спасибо.

ответ

1

Я думаю, что проблема связана с вашим typedef. const TProvider * const является указателем на const TProvider, но в вашем коде вы делаете новые экземпляры TProvider во время выполнения. Также вы можете прочитать в документации Qt о QList, что:

Тип значения QList должен быть назначаемым типом данных.

Таким образом, вы должны иметь указатель на TProvider и ваш ЬурейеЕ должен быть как:

typedef const TProvider * TProviderPointer;