Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: Igors от Июнь 12, 2014, 18:42



Название: MSVC + дека
Отправлено: Igors от Июнь 12, 2014, 18:42
Добрый день

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

Спасибо


Название: Re: MSVC + дека
Отправлено: Old от Июнь 12, 2014, 18:57
Шо делать ?  :'(
В мусор его, это компилятор.


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 12, 2014, 19:56
Ммм... а он должен такое издевательство компилить? Прошу цитатку из руководства по С++ :)


Название: Re: MSVC + дека
Отправлено: kambala от Июнь 12, 2014, 20:18
можно хранить указатели


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 20:22
Шо делать ?  :'(
Уж боюсь предлагать:

Код
C++ (Qt)
#include <deque>
 
struct CItem {
std::deque <boost::recursive_wrapper<CItem>> mChild;
};
 
 


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 12, 2014, 20:25
Аплодисменты m_ax :D


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 20:26
Или как вариант:

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


Название: Re: MSVC + дека
Отправлено: Alex Custov от Июнь 12, 2014, 20:51
Ммм... а он должен такое издевательство компилить? Прошу цитатку из руководства по С++ :)

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

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


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 21:01
Ммм... а он должен такое издевательство компилить? Прошу цитатку из руководства по С++ :)

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

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

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


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 12, 2014, 21:09
Да, почитал стандарт - действительно.

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


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 21:13
Однако list и vector спокойно комплируются. Значит проблема в deque.

Ничего удивительного, MSVC же  :)


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 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 возражения?


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 21:26
Цитировать
Не вижу где тут противоречие стандарту. Тип объявлен и имеется. Всё верно.

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

Это не только с декой, это с чем угодно работать не будет..  :)


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 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 а иное поведение и компиляция есть отхождение от святого стандарта и его святого компилятора :D


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 21:59
Цитировать
PPS а иное поведение и компиляция есть отхождение от святого стандарта и его святого компилятора
Да, поэтому святому MSVC всегда можно простить за слегка кривую "не очень" реализацию deque ) 


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 12, 2014, 22:01
Ммм.. Где? Где вы видите кривизну компилятора?

Тут кривизна реализации библиотек STD.
Где то я читал про Deque - что ему необходимо знать размер объекта, но был не уверен и потому разбирался.

И да - я не отказываюсь от мнения, что MSVC наиболее следующий стандарту компилятор.   А вот про его библиотеки ничего не говорю :D


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 22:30
Цитировать
Тут кривизна реализации библиотек STD.
Вот и я о том же..
Мыши плакали, кололись, но продолжали жевать кактус  :)


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 12, 2014, 22:56
Начните отделять мышей от кактуса :D

Я std::deque увидел сегодня раз третий в жизни.
1 - лабораторка, 2 - в учебнике, 3 - сегодня :D

Хотя я недоволен WinApi, но продолжаю пользоваться Windows. Просто иголки такииие мелкие и несущественные.

PS а проблема кстати высосана из пальца и в стандарте не рекомендуется использовать такую бяку.


Название: Re: MSVC + дека
Отправлено: m_ax от Июнь 12, 2014, 23:24
Цитировать
Начните отделять мышей от кактуса  :D

Да не раз уж.. Тут такая паническая атака начинается..
Так что уж сами, сами..

А я спать пойду)


Название: Re: MSVC + дека
Отправлено: Alex Custov от Июнь 12, 2014, 23:35
PS а проблема кстати высосана из пальца и в стандарте не рекомендуется использовать такую бяку.

ради интереса - где именно?


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 12, 2014, 23:47
PS бе бе бе :D

PPS первый час ночи, а я всё ещё стандарт читаю... ППц что со мной стало? :D

update: нет там такого, спутал использование одноименных переменных с названием класса :)


Название: Re: MSVC + дека
Отправлено: Igors от Июнь 13, 2014, 06:05
Ругается причём на
Код:
#define _DEQUESIZ	(sizeof (_Ty) <= 1 ? 16 \
: sizeof (_Ty) <= 2 ? 8 \
: sizeof (_Ty) <= 4 ? 4 \
: sizeof (_Ty) <= 8 ? 2 : 1)
.
А Вы пытались осмыслить что это написано? И как будет работать такая дека?

Уж боюсь предлагать:

Код
C++ (Qt)
#include <deque>
 
struct CItem {
std::deque <boost::recursive_wrapper<CItem>> mChild;
};
 
Решил "в том же стиле" - заменил на QList. Да, с выгодами деки пришлось расстаться  :'(


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 13, 2014, 08:41
Хз как будет работать :) И судя по отсутствию тем "боже мой дека в MSVC херовая" - она всё же работает и люди довольны :) Ну или по крайней мере не разочарованы :)


Название: Re: MSVC + дека
Отправлено: Old от Июнь 13, 2014, 08:58
И судя по отсутствию тем "боже мой дека в MSVC херовая" - она всё же работает и люди довольны :)
Такие темы есть и дека в MSVC действительно косячит.
Видать, на это просто все забили, т.к. по традиции микрософта - исправлять все равно никто ничего не будет.


Название: Re: MSVC + дека
Отправлено: Igors от Июнь 13, 2014, 09:06
Хз как будет работать :) И судя по отсутствию тем "боже мой дека в MSVC херовая" - она всё же работает и люди довольны :) Ну или по крайней мере не разочарованы :)
Не лучше ли посмотреть кусочек кода (что Вы же и привели) чем опираться на "кто что сказал"?  :)
В чем понт использовать деку, почему не вектор (изучайте)


Название: Re: MSVC + дека
Отправлено: Bepec от Июнь 13, 2014, 09:25
Я не вижу смысла в изучении не прикладной задачи на данный момент. Ибо забуду через неделю и толку с этого 0.