Russian Qt Forum
Май 07, 2024, 11:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: MSVC + дека  (Прочитано 12660 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 12, 2014, 18:42 »

Добрый день

"Самый строгий компилятор" (по Вересу) отказывается, падла, компилить это
Код
C++ (Qt)
#include <deque>
 
struct CItem {
std::deque <CItem> mChild;
};
 
Если заменить деку на вектор - все норм, но по задаче так нельзя. Шо делать ?  Плачущий

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Июнь 12, 2014, 18:57 »

Шо делать ?  Плачущий
В мусор его, это компилятор.
Записан
Bepec
Гость
« Ответ #2 : Июнь 12, 2014, 19:56 »

Ммм... а он должен такое издевательство компилить? Прошу цитатку из руководства по С++ Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Июнь 12, 2014, 20:18 »

можно хранить указатели
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #4 : Июнь 12, 2014, 20:22 »

Шо делать ?  Плачущий
Уж боюсь предлагать:

Код
C++ (Qt)
#include <deque>
 
struct CItem {
std::deque <boost::recursive_wrapper<CItem>> mChild;
};
 
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #5 : Июнь 12, 2014, 20:25 »

Аплодисменты m_ax Веселый
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #6 : Июнь 12, 2014, 20:26 »

Или как вариант:

Код
C++ (Qt)
#include <boost/container/deque.hpp>
 
using namespace boost::container;
 
struct CItem {
deque<CItem> mChild;
};
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Июнь 12, 2014, 20:51 »

Ммм... а он должен такое издевательство компилить? Прошу цитатку из руководства по С++ Улыбающийся

Класс считается типом сразу после объявления имени. Поэтому возможны необычные конструкции типа

Код
C++ (Qt)
class X : public Singleton<X>
{
...
};
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #8 : Июнь 12, 2014, 21:01 »

Ммм... а он должен такое издевательство компилить? Прошу цитатку из руководства по С++ Улыбающийся

Класс считается типом сразу после объявления имени. Поэтому возможны необычные конструкции типа

Код
C++ (Qt)
class X : public Singleton<X>
{
...
};

Это не совсем верно.. В данном случае, Singleton не зависит от типа X (т.е. внутри него нет переменных X) а значит на момент раскрутки этого выражения  class X : public Singleton<X> размер Singleton известен. Любое наследование от специализации Singleton полностью определяется на момент компиляции.   
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #9 : Июнь 12, 2014, 21:09 »

Да, почитал стандарт - действительно.

Однако list и vector спокойно комплируются. Значит проблема в deque.
« Последнее редактирование: Июнь 12, 2014, 21:13 от Bepec » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #10 : Июнь 12, 2014, 21:13 »

Однако list и vector спокойно комплируются. Значит проблема в deque.

Ничего удивительного, MSVC же  Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #11 : Июнь 12, 2014, 21:18 »

Ругается причём на
Код:
#define _DEQUESIZ	(sizeof (_Ty) <= 1 ? 16 \
: sizeof (_Ty) <= 2 ? 8 \
: sizeof (_Ty) <= 4 ? 4 \
: sizeof (_Ty) <= 8 ? 2 : 1)
.

Имеется мысль(мб глупая) что класс то объявлен, а вот его размер ещё неизвестен. Что равнозначно
Код:
class CItem;
std::deque <CItem> mChild;

Ииии... Да, равнозначная ошибка. Как тип класс объявлен, но как объект - нет и получить его размеры не получается.

Не вижу где тут противоречие стандарту. Тип объявлен и имеется. Всё верно.

PS возражения?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #12 : Июнь 12, 2014, 21:26 »

Цитировать
Не вижу где тут противоречие стандарту. Тип объявлен и имеется. Всё верно.

Это здесь нет противоречий стандарту?
Код
C++ (Qt)
class CItem;
std::deque <CItem> mChild;
 

Это не только с декой, это с чем угодно работать не будет..  Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #13 : Июнь 12, 2014, 21:35 »

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

А теперь усовершенствуем эту основу.

Вот что у нас получается
Код:
class CItem;
// Тип объявлен и доступен всем.
// The class-name is also inserted into the scope of the class itself; this is known as the injected-class-name.
std::deque <CItem> mChild;
// пытается определить размер типа. Фейл -> ошибка -> прерываем компиляцию.
class CItem
{int a;};
// а тут мы видим скобку, которая завершает реализацию класса и по стандарту он определён.
//A class is considered defined after the closing
brace of its class-specifier has been seen even though its member functions are in general not yet defined.

Вектор, лист и прочие контейнеры, использующие указатели - компилируются.

Deque пытается сразу при объявлении посчитать размер типа CItem. Но на данном этапе он только объявлен и компилятор вообще не в курсе об реализации. Потому размер неизвестен.

Вот и весь сказ. Получилось нормальное описание происходящего. Думаю Igors будет доволен Улыбающийся

PS а главное - соответствует стандарту!
PPS а иное поведение и компиляция есть отхождение от святого стандарта и его святого компилятора Веселый
« Последнее редактирование: Июнь 12, 2014, 21:45 от Bepec » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #14 : Июнь 12, 2014, 21:59 »

Цитировать
PPS а иное поведение и компиляция есть отхождение от святого стандарта и его святого компилятора
Да, поэтому святому MSVC всегда можно простить за слегка кривую "не очень" реализацию deque ) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.152 секунд. Запросов: 22.