crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> 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  


Цитата(maxvanceffer @ 30.9.2012, 0:25) *
Currency Someclass::exchangeRate()
{
some code ...
return Currency();
}


Твоя функция возвращает не указатель на объект. Поэтому вначале успешно создается объект
Currency()
а потом пытается создаться второй объект на основе первого
Currency(Currency)

Скорее всего тебе надо возвращать указатель на вновь созданный объект.
Currency *Someclass::exchangeRate()
{
   some code ...
   return new 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  


Цитата(maxvanceffer @ 30.9.2012, 0:25) *
почему компилятор передаёт параметр в конструктор обтекта ?

Цитата(Sokoloff @ 30.9.2012, 0:39) *
...вначале успешно создается объект
Currency()
а потом пытается создаться второй объект на основе первого
Currency(Currency)

Тут вроде разобрались.

Цитата(maxvanceffer @ 30.9.2012, 0:25) *
выдаёт ошибку : error: no matching function for call to 'Currency::Currency(Currency)'

Но почему же выдаётся эта ошибка? На первый взгляд нужный конструктор есть:
Цитата(maxvanceffer @ 30.9.2012, 0:25) *
explicit Currency( const Currency& other );

Почему же он не используется?
А дело в ключевом слове explicit: оно запрещает неявные преобразования. А поскольку функция exchangeRate возвращает не тот объект, который создан внутри неё (он локальный), то неявно вызывается копирующий конструктор. А он-то и скрыт для неявных вызовов с помощью explicit.
Решения вижу два:
1. Убрать ключевое слово explicit из конструктора Currency( const Currency& other );
2. При вызове функции exchangeRate явно создавать новый объект Currency так:
Currency c (exchangeRate ());


Сообщение отредактировал 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  


Цитата(Iron Bug @ 1.10.2012, 7:36) *
...с обычным конструктором копии.... а в данном случае его просто нет (а сходный метод используется только с явным вызовом конструктора со ссылкой - из-за explicit) и компилятор ругается.

Теперь я не понял. Как это нет конструктора копирования? А это:
Цитата(maxvanceffer @ 30.9.2012, 0:25) *
explicit Currency( const Currency& other );

Или имеется в виду, что это конструктор копирования, но необычный?
И, кстати, такая ошибка выдаётся даже без shared указателя - я проверял.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 1.10.2012, 20:44
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(iReset @ 1.10.2012, 23:04) *
Или имеется в виду, что это конструктор копирования, но необычный?
И, кстати, такая ошибка выдаётся даже без shared указателя - я проверял.

Не, это я гоню, видимо, после отпуска :) Shared указатель тут ни при чём.
Sokoloff правильно написал: действительно, сначала компилятор создаёт объект локально, а потом пытается создать его копию для стека. Но он её пытается вызвать неявно. Т. е. если убрать explicit, то всё будет ok.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 14:15