Форум программистов, компьютерный форум CyberForum.ru

Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" - C++

Восстановить пароль Регистрация
 
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
12.02.2014, 23:55     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #1
Выбивает ошибку, раньше никогда с const_cast не работал не совсем представляю что от меня требуется
C++
1
2
3
4
5
6
7
8
9
10
const WidgetShared& WidgetContainer::GetWidget( String id ) const
{
    mutable WidgetVector::iterator i; // error 1
    for ( i = const_cast<WidgetVector>(m_widgets).begin(); i < m_widgets.end(); i++ ) // error 2, 3
    {
        if ( (*i)->GetId() == id ) return (*i);
    }
 
return m_widgets.back();
}
Текст ошибок:
Кликните здесь для просмотра всего текста
  • c:\users\vbloodv\documents\visual studio 2008\projects\demo\src\widgetcontainer.cpp(23) : error C2071: i: недопустимый класс хранения
  • c:\users\vbloodv\documents\visual studio 2008\projects\demo\src\widgetcontainer.cpp(24) : error C2440: const_cast: невозможно преобразовать 'const WidgetVector' в 'WidgetVector'
    Для преобразования требуется конструктор или оператор пользовательского преобразования, который не может использоваться const_cast или reinterpret_cast
  • c:\users\vbloodv\documents\visual studio 2008\projects\demo\src\widgetcontainer.cpp(24) : error C2228: выражение слева от ".begin" должно представлять класс, структуру или объединение


первая ошибка понятна, только поля класса могут быть mutable, т.к. i в автоматической памяти оно тут не надо, а что делать с 2 и 3? Прошу Вас помочь !
Немного о типах:
Кликните здесь для просмотра всего текста
если это кому-то пригодится
C++
1
2
3
typedef boost::shared_ptr<Widget> WidgetShared;
typedef std::vector<WidgetShared> WidgetVector;
typedef boost::shared_ptr<WidgetContainer> ConteinerShared;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2014, 23:55     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'"
Посмотрите здесь:

C++ невозможно преобразовать "const char" в "char"
Ошибка 6 error C2664: strtok: невозможно преобразовать параметр 1 из "const char *" в "char *" C++
невозможно преобразовать параметр 1 из "const char [8]" в "LPCWSTR" C++
Невозможно преобразовать параметр 1 из "const wchar_t [12]" в "const char *" C++
error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 00:02     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
всего-то вместо
 mutable WidgetVector::iterator i; // error 1
сделать
 WidgetVector::const_iterator i;
 
const_cast ессно убрать.
vbloodv
13.02.2014, 00:06  [ТС]
  #3

Не по теме:

DU, Спасибо огромное !

DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 00:10     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #4
return m_widgets.back(); при пустом векторе крашнется.
да и не дело это. надо предусматривать нормальную возможность оповестить вызывающую сторону
о том, что ничего не найдено. например возвращать указатель на найденное или nullptr в противном
случае, а не ссылку. пусть вызывающая сторона разбирается. ну или исключения кидать. или еще как-нибудь
на свой вкус.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
13.02.2014, 00:44  [ТС]     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #5
C++
1
2
3
4
5
6
WidgetVector::const_iterator i;
    for ( i = m_widgets.begin(); i < m_widgets.end(); i++ )
    {
        if ( (*i)->GetId() == id ) break;
    }
    return (*i);
мне надо чтобы крашнулось
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 00:59     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #6
вообще это вроде UB.
может крашнуться или крашнутся попозже далеко от этого места, а может работать, но с глюками.
в дебаге и в релизе по разному себя повести. падать лучше как-то более явно. бросить исключение локального класса. его точно никто не отловит. ну или как-то по другому.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
13.02.2014, 01:13  [ТС]     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #7
DU, тогда nullptr возвращать нормальный стиль?

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
for ( WidgetVector::const_iterator i = m_widgets.begin(); i < m_widgets.end(); i++ )
    {
        if ( (*i)->GetId() == id ) return (*i);
    }
    return nullptr;
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 10:19     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #8
вполне себе метод. метод предоставил вызывающей стороне возможность проверить результат операции.
если вызывающей стороне это интересно, она проверит результат на "не ноль", если нет - обратится по
нулевому указателю и получит UB, но это уже ее проблемы, а у вызванного метода (у автора этого метода) совесть остается чистой.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
13.02.2014, 14:30  [ТС]     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #9
DU, как можно использовать nullptr в C++98 ?
visual studio 2008 у меня и пока наверное что-то вроде:
C++
1
return static_cast<void*>(0);
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.02.2014, 15:04     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #10
Цитата Сообщение от vbloodv Посмотреть сообщение
как можно использовать nullptr в C++98 ?
Используй 0
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
13.02.2014, 15:19     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Используй 0
NULL - так нагляднее.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
13.02.2014, 15:28  [ТС]     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #12
gray_fox, не получается:
C++
1
2
3
4
5
6
7
8
9
10
const WidgetShared& WidgetContainer::GetWidget( String id ) const
{
    WidgetVector::const_iterator i;
    for ( i = m_widgets.begin(); i < m_widgets.end(); i++ )
    {
        if ( (*i)->GetId() == id ) return (*i);
    }
    //return (*i); // nullptr нужен
    return 0;
}
Ворнинг:
Кликните здесь для просмотра всего текста
.\src\WidgetContainer.cpp(51) : error C2440: return: невозможно преобразовать 'int' в 'const WidgetShared &'
1> Причина: невозможно преобразовать 'int' в 'const WidgetShared'
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно


еще человек советует assert есть он в boost или в std98 ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 15:36     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'"
Еще ссылки по теме:

error C2664: strcmp: невозможно преобразовать параметр 1 из "char (*)[20]" в "const char *" C++
C++ Error C2664: RegisterClassW: невозможно преобразовать параметр 1 из "WNDCLASSEX *" в "const WNDCLASSW *"
C++ Невозможно преобразовать параметр 2 из "char" в "const char *"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
13.02.2014, 15:36     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #13
Цитата Сообщение от vbloodv Посмотреть сообщение
не получается
Возвращаемый тип у метода - ссылка, а возвращаешь указатель.
Цитата Сообщение от vbloodv Посмотреть сообщение
еще человек советует assert есть он в boost или в std98 ?
<cassert>

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
NULL - так нагляднее.
хз, мне не нравится) всё равно в С++ это 0 - целое число...



Добавлено через 4 минуты
vbloodv, т.е.
C++
1
2
3
4
5
6
7
const WidgetShared* WidgetContainer::GetWidget( String id ) const
{
   // ...
   if ( (*i)->GetId() == id ) return &*i;
   // ...
   return 0;
}
Yandex
Объявления
13.02.2014, 15:36     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'"
Ответ Создать тему
Опции темы

Текущее время: 17:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru