No matching function for call |
Здравствуйте, гость ( Вход | Регистрация )
No matching function for call |
maxvanceffer |
29.9.2012, 23:25
Сообщение
#1
|
Студент Группа: Участник Сообщений: 72 Регистрация: 30.5.2009 Из: Moldova Пользователь №: 790 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вообщем странный вобще задвиг у компилятара..
есть класс : Currency(); explicit Currency( const int& id, const QString &name, const QString& code ); explicit Currency( const Currency& other ); virtual ~Currency(); private: QSharedDataPointer<CurrencyData> d; написана прям по классике из доков Qt, и где в другом классе пытаюсь вернуть его и не может Currency Someclass::exchangeRate() { some code ... return Currency(); } выдаёт ошибку : error: no matching function for call to 'Currency::Currency(Currency)' почему компилятор передаёт параметр в конструктор обтекта ? |
|
|
Sokoloff |
29.9.2012, 23:39
Сообщение
#2
|
Участник Группа: Участник Сообщений: 237 Регистрация: 1.4.2009 Из: Москва Пользователь №: 654 Спасибо сказали: 50 раз(а) Репутация: 11 |
Currency Someclass::exchangeRate() { some code ... return Currency(); } Твоя функция возвращает не указатель на объект. Поэтому вначале успешно создается объект Currency() а потом пытается создаться второй объект на основе первого Currency(Currency) Скорее всего тебе надо возвращать указатель на вновь созданный объект.
|
|
|
maxvanceffer |
29.9.2012, 23:42
Сообщение
#3
|
Студент Группа: Участник Сообщений: 72 Регистрация: 30.5.2009 Из: Moldova Пользователь №: 790 Спасибо сказали: 0 раз(а) Репутация: 0 |
а что делать если мне нужно возвратить именно так ? без динамического создания ?
|
|
|
iReset |
30.9.2012, 13:19
Сообщение
#4
|
Участник Группа: Участник Сообщений: 178 Регистрация: 6.6.2012 Пользователь №: 3414 Спасибо сказали: 23 раз(а) Репутация: 2 |
почему компилятор передаёт параметр в конструктор обтекта ? ...вначале успешно создается объект Currency() а потом пытается создаться второй объект на основе первого Currency(Currency) Тут вроде разобрались. выдаёт ошибку : error: no matching function for call to 'Currency::Currency(Currency)' Но почему же выдаётся эта ошибка? На первый взгляд нужный конструктор есть: explicit Currency( const Currency& other ); Почему же он не используется? А дело в ключевом слове explicit: оно запрещает неявные преобразования. А поскольку функция exchangeRate возвращает не тот объект, который создан внутри неё (он локальный), то неявно вызывается копирующий конструктор. А он-то и скрыт для неявных вызовов с помощью explicit. Решения вижу два: 1. Убрать ключевое слово explicit из конструктора Currency( const Currency& other ); 2. При вызове функции exchangeRate явно создавать новый объект Currency так:
Сообщение отредактировал iReset - 30.9.2012, 13:20 |
|
|
Iron Bug |
1.10.2012, 6:36
Сообщение
#5
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
скорее всего, проблема у вас вообще в указателе. обычно, shared указатели требуют, чтобы объект был с обычным конструктором копии (это действительно так для QSharedDataPointer, я ради интереса в гугле глянула). а в данном случае его просто нет (а сходный метод используется только с явным вызовом конструктора со ссылкой - из-за explicit) и компилятор ругается.
|
|
|
iReset |
1.10.2012, 20:04
Сообщение
#6
|
Участник Группа: Участник Сообщений: 178 Регистрация: 6.6.2012 Пользователь №: 3414 Спасибо сказали: 23 раз(а) Репутация: 2 |
...с обычным конструктором копии.... а в данном случае его просто нет (а сходный метод используется только с явным вызовом конструктора со ссылкой - из-за explicit) и компилятор ругается. Теперь я не понял. Как это нет конструктора копирования? А это: explicit Currency( const Currency& other ); Или имеется в виду, что это конструктор копирования, но необычный? И, кстати, такая ошибка выдаётся даже без shared указателя - я проверял. |
|
|
Iron Bug |
1.10.2012, 20:44
Сообщение
#7
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Или имеется в виду, что это конструктор копирования, но необычный? И, кстати, такая ошибка выдаётся даже без shared указателя - я проверял. Не, это я гоню, видимо, после отпуска Shared указатель тут ни при чём. Sokoloff правильно написал: действительно, сначала компилятор создаёт объект локально, а потом пытается создать его копию для стека. Но он её пытается вызвать неявно. Т. е. если убрать explicit, то всё будет ok. |
|
|
Текстовая версия | Сейчас: 1.12.2024, 14:28 |