LINUX.ORG.RU

Не компилируется вызов метода value() для QMap

 ,


0

2

Есть класс NavigationItem с вот таким методом:

QVariant NavigationItem::getValue() const
{
    return val;
}

Из этих NavigationItem я делаю набор данных:
    // Набор именованных навигационных данных
    QMap<QString, NavigationItem> data;

И почему-то не компилируется такой код:
data.value("azimuth").getValue();

Ошибки вот такие:
../MobileIndicator/src/modules/dataLayer/NavigationData.cpp: In member function 'const T QMap<K, V>::value(const Key&, const T&) const [with Key = QString; T = NavigationItem]':
../MobileIndicator/src/modules/dataLayer/NavigationData.cpp:75:27: error: no matching function for call to 'NavigationItem::NavigationItem()'
     return data.value(name).getValue();
                           ^
../MobileIndicator/src/modules/dataLayer/NavigationData.cpp:75:27: note: candidates are:
In file included from ../MobileIndicator/src/modules/dataLayer/NavigationData.h:7:0,
                 from ../MobileIndicator/src/modules/dataLayer/ViewDataEmitter.h:7,
                 from ../MobileIndicator/src/core/Core.h:12,
                 from ../MobileIndicator/src/core/App.h:5,
                 from ../MobileIndicator/src/main.h:7,
                 from ../MobileIndicator/src/modules/dataLayer/NavigationData.cpp:2:
../MobileIndicator/src/modules/dataLayer/NavigationItem.h:13:5: note: NavigationItem::NavigationItem(QVariant::Type)
     NavigationItem(QVariant::Type iType);
     ^
../MobileIndicator/src/modules/dataLayer/NavigationItem.h:13:5: note:   candidate expects 1 argument, 0 provided
../MobileIndicator/src/modules/dataLayer/NavigationItem.h:9:7: note: NavigationItem::NavigationItem(const NavigationItem&)
 class NavigationItem
       ^
../MobileIndicator/src/modules/dataLayer/NavigationItem.h:9:7: note:   candidate expects 1 argument, 0 provided
../MobileIndicator/src/modules/dataLayer/NavigationItem.h:9:7: note: NavigationItem::NavigationItem(NavigationItem&&)
../MobileIndicator/src/modules/dataLayer/NavigationItem.h:9:7: note:   candidate expects 1 argument, 0 provided
../MobileIndicator/src/modules/dataLayer/NavigationData.cpp:75:27: note:   when instantiating default argument for call to const T QMap<K, V>::value(const Key&, const T&) const [with Key = QString; T = NavigationItem]
     return data.value(name).getValue();
                           ^


PS: Зато нормально компилируется конструкция:
data["azimuth"].getValue()

но я бы ей не хотел пользоваться для чтения, потому что оператор [ ] «Returns the value associated with the key key as a modifiable reference». У меня же вызывается геттер, и ничего не модифицируется, поэтому [ ] - вроде как оверхед.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

error: no matching function for call to 'NavigationItem::NavigationItem()'

А у него вообще есть конструктор без параметров?

wolph ★★
()
Ответ на: комментарий от wolph

Нет, но я же не конструктор NavigationItem вызываю, а getValue().

Я не могу понять, почему для обращения к уже существующему элементу пытается вызваться конструктор.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

value возвращает копию, а не ссылку. Потому что там есть параметр «дефолтное значение», а именно const T &defaultValue = T(). Оно то и просит конструктор без параметров.

wolph ★★
()
Ответ на: комментарий от Xintrea

Собсно, или сам подсунь ему в параметр ссылку на явно созданное собой дефолтное значение, или что лучше всего - проверяй существование элемента и потом бери его по ссылке через [].

wolph ★★
()
Ответ на: комментарий от wolph

Ммм... Я думал, что если вызываю вариант value() с одним параметром, а не с двумя, то вообще пофигу какой там конструктор.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от wolph

Хотя... Все равно у тебя ничего не выйдет без дефолтного конструктора. Потому как [] он тоже нужен, чтобы создать элемент, если среди всего его не найдется.

Попробуй использовать стандартные крестовые контейнеры - тамошний at() не будет ничего создавать по умолчанию, а кинет out_of_range

wolph ★★
()
Ответ на: комментарий от Xintrea

Не существует value с одним параметром - их всегда два, просто второй задан по умолчанию.

wolph ★★
()
Ответ на: комментарий от wolph

Да, компилер затупил на создании значений QMap:

data["course"]=NavigationItem(QVariant::Type::Double);
data["azimuth"]=NavigationItem(QVariant::Type::Double);

А конструктор вот такой:
// Конструктор, обязательно требуется тип создаваемого значения
NavigationItem::NavigationItem(QVariant::Type iType)
{
    type=iType;
    isModifyFlag=true; // При создании дефолтного значения считается, что значение было изменено
}

Я вот не пойму, если я просто добавлю конструктор без параметров, то работать будет? Мне же нужно в QMap засунуть параметризированные объекты.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Да, будет. Можешь сделать чтобы по умолчанию конструировалось невалидное значение, или что то типо того.

wolph ★★
()

лень проверять, но попробуй добавить в вызов value() дефолтное значение, если конструктор по умолчанию добавить не можешь

arcanis ★★★★
()

data.value(«azimuth»).value<NavigationItem>().getValue()

anonymous
()

Так и не понял, почему тебе

const T QMap::value(const Key &key, const T &defaultValue = T()) const
лучше, чем
const T QMap::operator[](const Key &key) const

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Ну это вопрос оптимизации. В списочных контейнерах, например, для чтения не рекомендуют [ ], и вместо скобок есть метод at(). Я думал что в QMap так же.

Xintrea ★★★★★
() автор топика

А сколько у тебя этих валуей типа «азимут»? Штук двадцать то наберется? Может быть вообще не юзать кумап? Ну сделай класс с именоваными геттерами типа «getAzimuth() const» и не парься. В чем смысл мапа тут вообще?

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Двенадцать штук. Вначале я так и делал, потом запарился обезьянничать. Потому что нужны не просто сеттеры-геттеры, но и например флаги об изменении значений. Потом нужны метки качества хранимых значений, потом еще что-то добавится. Кароч лучше иметь управляемый код.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

флаги об изменении значений

Эмитнуть сигнал в конце сеттера? Или это типа внутренний state какой-то?

метки качества хранимых значений

А что это? Интересно!

управляемый код

Ну 12 штук не много как по мне. Я тоже бывет использую что-то не потому что оно там как влитое будет, а потому что так код будет лаконичнее или удобнее, например, скаляр какойнить, но, мап.. это кажется перегиб.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Эмитнуть сигнал в конце сеттера? Или это типа внутренний state какой-то?

Да. Он может запроситься в любой момент другим асинхронным кодом, а значение должно показать, изменилось ли оно после последнего запроса к оборудованию.

метки качества хранимых значений
А что это? Интересно!

Это оценка достоверности значений. Его может выдавать как оборудование, так и программно может вычисляться.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ок, пусть будет стейт, геттеры и статистика. Я все еще за именованые геттеры и сеттеры на всю эту кухню. Считаю незачем вводить новую сущность только ради сомнительного личного удобства написания обращений.

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.