msvc2010: ошибка: C2440: инициализация: невозможно преобразовать

335
02 ноября 2017, 07:15

Использую std::multiset Он определен в подключаемых заголовках vs2010 Компилятор (msvc2010) ругается на то, что я неверно инициализирую экземпляр std::multiset::const_iterator, а также неверно использую оператор сравнения. Возможно, конечно это из-за неполной поддержки компилятором стандарта C++11. Но все же я решил спросить. Можно ли это как-то обойти? Ошибка возникает и для неконстантных итераторов.

typedef std::multiset<
    const RuleInfo*, // пользовательская стрктура
    RuleInfoCmpRulePtrParMore // оператор сравнения
> RuleInfoConstPtrMSet;
...
void CriteriaDialog::addButtonClicked() {
    RuleInfoConstPtrMSet::const_iterator it = allowable_rules_.begin(); // 1-я ошибка
    if ( ui->combo_box_param_->currentIndex() )
        std::advance( it, ui->combo_box_param_->currentIndex() );
    if ( it == allowable_rules_.cend() ) return; // 2 ошибка
    // ...
}

Первая ошибка:

C:\Files\qt\universal_tsw_client\src\tsw-client\ui\criteria_dialog.cpp:328: ошибка: C2440: инициализация: невозможно преобразовать "std::_Tree_const_iterator<_Mytree>" в "std::_Tree_const_iterator<_Mytree>"
with
[
    _Mytree=std::_Tree_val<std::_Tset_traits<const RuleInfo *,RuleInfoCmpRulePtrParMore,std::allocator<const RuleInfo *>,false>>
]
and
[
    _Mytree=std::_Tree_val<std::_Tset_traits<const RuleInfo *,RuleInfoCmpRulePtrParMore,std::allocator<const RuleInfo *>,true>>
]
Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно

Вторая ошибка:

C:\Files\qt\universal_tsw_client\src\tsw-client\ui\criteria_dialog.cpp:333: ошибка: C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "std::_Tree_const_iterator<_Mytree>" (или приемлемое преобразование отсутствует)
with
[
    _Mytree=std::_Tree_val<std::_Tset_traits<const RuleInfo *,RuleInfoCmpRulePtrParMore,std::allocator<const RuleInfo *>,true>>
]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\exception(470): может быть "bool std::operator ==(const std::_Exception_ptr &,const std::_Exception_ptr &)" [найдено при поиске с зависимостью от аргументов]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\exception(475): или       "bool std::operator ==(std::_Null_type,const std::_Exception_ptr &)" [найдено при поиске с зависимостью от аргументов]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\exception(481): или       "bool std::operator ==(const std::_Exception_ptr &,std::_Null_type)" [найдено при поиске с зависимостью от аргументов]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\system_error(408): или       "bool std::operator ==(const std::error_code &,const std::error_condition &)" [найдено при поиске с зависимостью от аргументов]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\system_error(416): или       "bool std::operator ==(const std::error_condition &,const std::error_code &)" [найдено при поиске с зависимостью от аргументов]
c:\qt\4.8.5\include\qtcore\../../src/corelib/global/qglobal.h(2015): или       "bool operator ==(QBool,bool)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/global/qglobal.h(2016): или       "bool operator ==(bool,QBool)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/global/qglobal.h(2017): или       "bool operator ==(QBool,QBool)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(392): или       "bool operator ==(QChar,QChar)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qbytearray.h(527): или       "bool operator ==(const QByteArray &,const QByteArray &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qbytearray.h(529): или       "bool operator ==(const QByteArray &,const char *)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qbytearray.h(531): или       "bool operator ==(const char *,const QByteArray &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(908): или       "bool operator ==(QString::Null,QString::Null)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(909): или       "bool operator ==(QString::Null,const QString &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(910): или       "bool operator ==(const QString &,QString::Null)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(936): или       "bool operator ==(const char *,const QString &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(949): или       "bool operator ==(const char *,const QLatin1String &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(962): или       "bool operator ==(const QLatin1String &,const QLatin1String &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(1202): или       "bool operator ==(const QStringRef &,const QStringRef &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(1205): или       "bool operator ==(const QString &,const QStringRef &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(1208): или       "bool operator ==(const QStringRef &,const QString &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(1212): или       "bool operator ==(const QLatin1String &,const QStringRef &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(1215): или       "bool operator ==(const QStringRef &,const QLatin1String &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(1236): или       "bool operator ==(const char *,const QStringRef &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qstring.h(1238): или       "bool operator ==(const QStringRef &,const char *)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qsize.h(83): или       "bool operator ==(const QSize &,const QSize &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qsize.h(233): или       "bool operator ==(const QSizeF &,const QSizeF &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qpoint.h(80): или       "bool operator ==(const QPoint &,const QPoint &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qpoint.h(238): или       "bool operator ==(const QPointF &,const QPointF &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qrect.h(162): или       "bool operator ==(const QRect &,const QRect &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qrect.h(599): или       "bool operator ==(const QRectF &,const QRectF &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qmargins.h(77): или       "bool operator ==(const QMargins &,const QMargins &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qhash.h(198): или       "bool operator ==(const QHashDummyValue &,const QHashDummyValue &)"
c:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qvariant.h(413): или       "bool operator ==(const QVariant &,const QVariantComparisonHelper &)"
c:\qt\4.8.5\include\qtnetwork\../../src/network/kernel/qhostaddress.h(137): или       "bool operator ==(QHostAddress::SpecialAddress,const QHostAddress &)"
c:\files\qt\universal_tsw_client\src\tsw-client\ui\../criteria_typedefs.h(83): или       "bool operator ==(const RuleInfo &,const RuleInfo &)"
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xtree(315): или       "bool std::_Tree_const_iterator<_Mytree>::operator ==(const std::_Tree_const_iterator<_Mytree> &) const"
with
[
    _Mytree=std::_Tree_val<std::_Tset_traits<const RuleInfo *,RuleInfoCmpRulePtrParMore,std::allocator<const RuleInfo *>,true>>
]
при попытке сопоставить список аргументов "(std::_Tree_const_iterator<_Mytree>, std::_Tree_const_iterator<_Mytree>)"
with
[
    _Mytree=std::_Tree_val<std::_Tset_traits<const RuleInfo *,RuleInfoCmpRulePtrParMore,std::allocator<const RuleInfo *>,true>>
]
and
[
    _Mytree=std::_Tree_val<std::_Tset_traits<const RuleInfo *,RuleInfoCmpRulePtrParMore,std::allocator<const RuleInfo *>,false>>
]

UPD: Пользователь @AnT заметил, что в листингах не было объявления объекта allowable_rules_, он объявлен как объект типа typedef std::<const RuleInfo*, RuleInfoCmpRulePtrParMore> видимо, msvc не кастит итераторы multiset к set,или такого преобразовния не было в реализации STL от Microsoft, т.к. в gcc такой код собирался.

READ ALSO
WINAPI/Winapi C++, отрисовка Bitmap

WINAPI/Winapi C++, отрисовка Bitmap

При отрисовке изображения Bitmap оно накладывается на само себя, а если выносить вне, то происходит мерцание изображения

517
Poco &amp; Mysql = ошибка Error in my_thread_global_end(): 1 threads didn&#39;t exit

Poco & Mysql = ошибка Error in my_thread_global_end(): 1 threads didn't exit

Использую библиотеку Poco в своем проектеА именно подключение к mysql

331
Ошибка при конвертации BSTR в QString

Ошибка при конвертации BSTR в QString

У меня есть функция, которая делает выборку по WMI, вот пример - https://msdnmicrosoft

255
Странные ошибки в visual studio

Странные ошибки в visual studio

Уважаемое комьюнити, столкнулся с проблемой в visual studio, которое невероятно раздражаетА именно:

246