Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Компилятор не может выбрать конструктор, а я его не могу понять.  (Прочитано 11570 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 12-12-2010 17:40 » 

Компилятор - gcc (g++).

Цитата
Events.cpp:139: error: no matching function for call to ‘models::Event::Event(models::Events* const, models::EventData*&)’
Event.h:39: note: candidates are: models::Event::Event(models::Events*, models::EventData&)
Event.h:34: note:                 models::Event::Event(const models::Event&)

Event.h:
Код: (C++)
  1. class Event
  2. {
  3.     Events* const owner;
  4.     EventData &data;
  5.  
  6. public:
  7.     Event(Events* const owner, EventData &initData) :
  8.         owner(owner), data(initData)

Ошибка выскакивает на компиляции метода класса Events.

Event.cpp:
Код: (C++)
  1.         EventData* ed;
  2.         Event* e;
Код: (C++)
  1.         e = new Event(this, ed);

Непонятно:
1. Почему компилятор игнорирует const в определении конструктора Event(Events* const owner, EventData &initData)?
2. Почему он считает, что конструктор копирования по умолчанию здесь подходит? Ведь нет совпадений по параметрам!

Offtopic:

Нашел багу в теге подсветки: нумерация строк подсветки не понимает, что задана нумерация строк не с 1. В TODO...



Добавлено через 2 минуты и 12 секунд:
Кстати, const_cast<Event*>(this) не помогает.

Добавлено через 2 минуты и 26 секунд:
Ошибку понял: this тут не при чем — второй параметр ссылка, а я подсовывал указатель.

Второй вопрос остается открытым.
« Последнее редактирование: 12-12-2010 17:45 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 12-12-2010 18:55 » 

он, скорее всего, рассудил так:

вызывается конструктор, но перегрузка не найдена. А дай-ка я покажу ему все варианты конструктора
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-12-2010 20:22 » 

Логично. Но несколько сбивает с толку. Я привык к сообщениям BCB6, а с GCC на C++ работал мало, от того и не понял его.

Т.е. я сейчас пишу и отлаживаю на GCC и думаю, что перенеся потом код на BCB6 он будет почти наверняка работать (у BCB6 свой диалект — не полностью совместимый с ANSI C++).
« Последнее редактирование: 12-12-2010 20:24 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 13-12-2010 04:02 » 

1.
Код: (C++)
Event(Events* const owner, EventData &initData)
тут получается константный указатель, а не константное значение под указаетелем, но т.к. указетель (те самые 4 байта, ну или 8) передаются по значению, то const тут не нужен
если нужны константные данные, то будет вот так
Код: (C++)
Event(const Events * owner, EventData &initData)

2. Да GCC если не находит кандидата, то выдаёт все метода с подходящим именем Улыбаюсь - ну тут Алексей уже всё сказал
3. У BCB6 насколько я помню компилятор гораздо больше соответсвует стандарту чем VC6 скажем, но до GCC последних версий ему всяк далеко Улыбаюсь, кроме того gcc последних версий частично подерживет грядущий стандарт (с нужным ключиком), ну а для совместимости с BCB6 его можно заставить работать в режиме какого-нибуть старого стандарта, там есть специальные ключики.
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 13-12-2010 04:21 » 

Антон, у меня gcc 4.1.2 и не нашел я параметров для -std= для "сделать хуже". Вариантов для C++ там всего два: c++98 и gnu++98.

У BCB6 есть режим совместимости компилятора, но при этом перестает работать VCL-библиотека и потому фактически используется один режим - свой диалект.
Одна из баг BCB6 и его библиотек, которую я нашел: std::deque::find выдает не const_iterator, хотя я его просил iterator, но компиляция проходит и только выдает warning-и.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 13-12-2010 04:32 » 

man gcc выдаёт вот такое
(click to show)
-std=
           Determine the language standard.  This option is currently only
           supported when compiling C or C++.  A value for this option must be
           provided; possible values are

           c89
           iso9899:1990
               ISO C90 (same as -ansi).

           iso9899:199409
               ISO C90 as modified in amendment 1.

           c99
           c9x
           iso9899:1999
           iso9899:199x
               ISO C99.  Note that this standard is not yet fully supported;
               see <http://gcc.gnu.org/gcc-4.2/c99status.html> for more
               information.  The names c9x and iso9899:199x are deprecated.

           gnu89
               Default, ISO C90 plus GNU extensions (including some C99
               features).

           gnu99
           gnu9x
               ISO C99 plus GNU extensions.  When ISO C99 is fully implemented
               in GCC, this will become the default.  The name gnu9x is
               deprecated.

           c++98
               The 1998 ISO C++ standard plus amendments.

           gnu++98
               The same as -std=c++98 plus GNU extensions.  This is the
               default for C++ code.

           Even when this option is not specified, you can still use some of
           the features of newer standards in so far as they do not conflict
           with previous C standards.  For example, you may use "__restrict__"
           even when -std=c99 is not specified.

           The -std options specifying some version of ISO C have the same
           effects as -ansi, except that features that were not in ISO C90 but
           are in the specified version (for example, // comments and the
           "inline" keyword in ISO C99) are not disabled.

самое интересное это (если я правильно понял этот абзац)
Цитата
          Even when this option is not specified, you can still use some of
           the features of newer standards in so far as they do not conflict
           with previous C standards.  For example, you may use "__restrict__"
           even when -std=c99 is not specified.


У BCB6 есть режим совместимости компилятора, но при этом перестает работать VCL-библиотека и потому фактически используется один режим - свой диалект.
Вот гад.

Одна из баг BCB6 и его библиотек, которую я нашел: std::deque::find выдает не const_iterator, хотя я его просил iterator, но компиляция проходит и только выдает warning-и.
не понял это предложение.

Кстати открыл для себя IDE - QT-Creator (последняя бета с ftp://ftp.qt.nokia.com/qtcreator/)
очень хорошая среда разработки С++
очень много приятных фишек, особенно радует очень интелектуальная подсветка синтаксиса, даже лучше чем в VS с плагинами для подсветки
и очень быстрый поиск
« Последнее редактирование: 13-12-2010 05:09 от RXL » Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 13-12-2010 04:38 » 

Заметь! "C standard" и "C++ standard" - штуки разные.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 13-12-2010 04:42 » 

угу, но малоли, может и для C++ так работает (у gcc не сильно хорошие доки)

ну ладно, ладно виноват Улыбаюсь мне казалось там побольше опций для стандартов
но я бы всёравно попробовал посмотреть на работу компилятора с опцией std=c++98
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 13-12-2010 04:47 » 

Попробую.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 13-12-2010 05:03 » new

Offtopic:


>>Кстати открыл для себя IDE - QT-Creator (последняя бета с ftp://ftp.qt.nokia.com/qtcreator/)

и я тоже открыл несколько месяцев назад Улыбаюсь Но дёготь тоже есть:
http://www.forum.crossplatform.ru/index.php?showtopic=5412
Поставлю в угол.

« Последнее редактирование: 13-12-2010 05:05 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines