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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

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

12.02.2014, 23:55. Просмотров 439. Ответов 12
Метки нет (Все метки)

Выбивает ошибку, раньше никогда с 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'"
Посмотрите здесь:

Невозможно преобразовать "const char" в "char" - C++
Вот код: void vvod() { char name_of_file; int i; char linetype1; char linetype2; int razmer_pera; struct colour {

Невозможно преобразовать "overloaded-function" в "LPDSENUMCALLBACKW" - C++
Всем привет. Решил изучить библиотеку DirectSound. Попробовал пример с сайта microsoft, а именно, узнать список подключенных устройств для...

Невозможно преобразовать "void *" в "st *" - C++
struct st *PTR; PTR = malloc(sizeof(struct st)); Для преобразования &quot;void*&quot; к указателю на тип, не являющемуся &quot;void&quot;, требуется...

Ошибка: "невозможно преобразовать 'int' в 'int [5]'" - C++
Ребят помогите не могу понять что за ошибка Пишет тип ошибка error C2440: инициализация: невозможно преобразовать 'int' в 'int ' ...

Ошибка "Constant expression is required" - const в сlass - C++
Создал класс: class TVseGrup { public: TVseGrup(const short KolTo4=0) : FKolTo4(KolTo4) {FKolTo4=0;} const short FKolTo4; ...

Невозможно преобразовать 'const char [6]' в 'long' - C++
Есть код: FILE *Protectdll; FILE *Coredll; FILE *Console; Protectdll = fopen(&quot;Protect.dll&quot;, &quot;rb&quot;); Coredll =...

Ошибка "чтение памяти невозможно" во время перехода к строке с функцией - C++
При запуске программы вижу ошибку &quot;чтение памяти невозможно&quot; во время перехода к строке с функцией ext() Не могу понять в чем дело,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 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
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 00:10     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #4
return m_widgets.back(); при пустом векторе крашнется.
да и не дело это. надо предусматривать нормальную возможность оповестить вызывающую сторону
о том, что ничего не найдено. например возвращать указатель на найденное или nullptr в противном
случае, а не ссылку. пусть вызывающая сторона разбирается. ну или исключения кидать. или еще как-нибудь
на свой вкус.
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
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 00:59     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #6
вообще это вроде UB.
может крашнуться или крашнутся попозже далеко от этого места, а может работать, но с глюками.
в дебаге и в релизе по разному себя повести. падать лучше как-то более явно. бросить исключение локального класса. его точно никто не отловит. ну или как-то по другому.
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
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 10:19     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #8
вполне себе метод. метод предоставил вызывающей стороне возможность проверить результат операции.
если вызывающей стороне это интересно, она проверит результат на "не ноль", если нет - обратится по
нулевому указателю и получит UB, но это уже ее проблемы, а у вызванного метода (у автора этого метода) совесть остается чистой.
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!
1447 / 1176 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
13.02.2014, 15:04     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #10
Цитата Сообщение от vbloodv Посмотреть сообщение
как можно использовать nullptr в C++98 ?
Используй 0
SatanaXIII
Супер-модератор
Эксперт С++
5603 / 2637 / 242
Регистрация: 01.11.2011
Сообщений: 6,497
Завершенные тесты: 1
13.02.2014, 15:19     Ошибка преобразования "Невозможно преобразовать 'const WidgetVector' в 'WidgetVector'" #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Используй 0
NULL - так нагляднее.
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'"
Еще ссылки по теме:

Невозможно преобразовать параметр 1 из 'const char [15]' в 'LPCWSTR' - C++
с сайта скачала прогу которая должна рисовать сферу, но при компилировании выходит ошибка:error C2664: auxInitWindowW: невозможно...

Невозможно преобразовать параметр из int в const char - C++
Приветствую, помогите пожалуйста исправить следующую ошибку: printf: невозможно преобразовать параметр 1 из &quot;int&quot; в &quot;const char *&quot; Хотя...

Fopen: невозможно преобразовать параметр 1 из 'LPWSTR' в 'const char *' - C++
#include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include&lt;cstdio&gt; #include&lt;io.h&gt; int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE...

Ошибка C3374 невозможно получить адрес "void function()" пока не будет создан экземпляр делегата - C++
C++/CLR. Работаю с CURL. Пытаюсь вызвать данную функцию: static size_t write_data(char *ptr, size_t size, size_t nmemb, string* data)...

Ошибка "преобразования" параметра - C++
Доброго времени суток! Вылетает ошибка: error C2664: Dictionary::deleteNode: невозможно преобразовать параметр 1 из 'char ' в 'char' ...


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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1447 / 1176 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 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'"
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru