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

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

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

« : 15-04-2012 22:07 » new

Напоролся по невнимательности на грабли с упомянутой ошибкой. Пытался завести в классе поле в духе
Код: (C++)
QMap<QString, QWeakPointer<MyClass> > instances_;
и получил упомянутую ошибку.

Вся беда оказалась в том, что я позабыл включить заголовок QMap - однако же, вместо адекватного текста ошибки, получил пресловутое малоинформативное сообщение об ошибке "field has incomplete type", заставившее меня думать, что я не прав где-то в частностях.

Надо думать, сам QMap уже каким-то боком был косвенно включён из других заголовков, но каким-то неправильным образом.

Возможно, кому-нибудь поможет, потому что беглое гугление далеко не сразу навело на правильный ответ.
« Последнее редактирование: 15-04-2012 22:09 от Вад » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 16-04-2012 05:34 » 

Я бы использовал typedef. Думаю, ошибка компиляции была бы именно на нем.
Записан

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

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

« Ответ #2 : 16-04-2012 08:10 » 

RXL, что с typedef, что без - всё едино. "incomplete type" при попытке инстанциировать шаблон QMap. Или ты подразумеваешь typedef для самого QMap? Я проверю.
« Последнее редактирование: 16-04-2012 08:13 от Вад » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #3 : 16-04-2012 08:38 » 

В смысле "для QMap"?

Код: (C++ (Qt))
typedef QMap<QString, QWeakPointer<MyClass> > MyClassMap;
Записан

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

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

« Ответ #4 : 16-04-2012 10:02 » 

RXL, ровно то же самое.
Без #include <QMap> вариант с typedef точно такое же невнятное сообщение об ошибке. Причём, не на строке typedef, а на строке, где объявляется переменная типа MyClassMap.
Записан
Anchorite
Гость
« Ответ #5 : 16-04-2012 10:37 » 

Что непонятного в "field has incomplete type"?
Имя типа известно, что он из себя представляет - нет.
Обычное последствие опережающего объявления.   
Записан
Вад
Модератор

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

« Ответ #6 : 16-04-2012 12:10 » 

Anchorite, понятно только то, что про тип компилятору что-то непонятно.

В итоге разобрался, что да, к ошибке приводит именно опережающее объявление в духе:
Код: (C++)
template <typename Key, typename Value>
class QMap;

typedef QMap<int, int> MyClassMap;

int main() {
    MyClassMap instance_;
    return 0;
};

Для сравнения, VS 2008 эту ошибку диагностирует так:
Цитата
error C2079: 'instance_' uses undefined class 'QMap<Key,Value>'
- по-моему, здесь всё понятно (для непонятливых по коду ошибки ещё и в MSDN всё подробно написано). А у Qt - извините, не очень.

Я не так чтобы очень привык объявлять шаблоны вперёд (особенно когда их за меня объявляют), а потом не давать реализацию или забывать включать заголовки. Поэтому для меня сообщение о том, что тип "какой-то неполный", недостаточно информативно. Дело привычки, наверное, но я бы предпочёл без таких привычек Улыбаюсь

PS. Отдельного вопроса заслуживает то, почему такое опережающее объявление вообще оказалось в каком-то стандартном qt-заголовке.
« Последнее редактирование: 16-04-2012 12:17 от Вад » Записан
Anchorite
Гость
« Ответ #7 : 16-04-2012 12:14 » 

Сдается мне, что дело не в Qt, а в gcc =]
Записан
Вад
Модератор

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

« Ответ #8 : 16-04-2012 12:18 » 

Anchorite, в смысле текста ошибки? Да, похоже на то. Но декларация - на совести Qt (а забытый заголовок - уже на моей Улыбаюсь )

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #9 : 17-04-2012 04:21 » 

Вад, в Qt - если на что-то incomplite ругается, первым делом надо пробовать заголовки используемых Q-классов ставить в реализации. Оповещения там действительно кривые
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines