Как создать структуру, которая содержит список себя?

В настоящее время в Webstorm 2017.3 имеется ошибка, которая препятствует установке библиотек Javascript через ‘Предпочтения | Языки и Рамки | JavaScript | Библиотеки | Скачайте и установите метод.

Это отслеживается здесь, и последняя версия EAP (Ранний предварительный доступ) (Webstorm 2017.3.2 на момент написания статьи) устраняет проблему. https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FWEB-29725

Я несколько часов стучал головой об стену, надеюсь, это поможет кому-то еще.

6
задан Baum mit Augen 7 August 2017 в 19:29
поделиться

4 ответа

Если вам нужна рабочая среда для того, что кажется ошибкой VC6, создайте список динамически:

#include <list>
#include <string>     // I don't use MFC

struct Url
{
    std::string strUrl;
    std::list<Url> * children;

    Url() {
       children = new std::list <Url>;
    }

    ~Url() {
        delete children;
    }
};

int  main()
{
    Url u1, u2;
    u1.children->push_back(u2);
}

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

Url array[5]; 

например в качестве члена не будет. Я тоже ничего не могу найти в стандарте, но sizeof (std:; list ) не зависит от того, что это за список. Предположим, что список был реализован как (здесь какой-то псевдо-C ++):

list <T> {
   listEntry <T> * first;
};

, тогда нет неизвестного размера, с которым нужно иметь дело. Рассмотрим следующий минимальный код, который решает проблему спрашивающих:

template <typename T> struct A {
};

struct B {
    A <B> b;
};

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

6
ответ дан 9 December 2019 в 20:48
поделиться

Вы можете сказать нам, какой компилятор вы используете? Нет ничего плохого в том, что вы делаете. Я попробовал следующее на VS2008 SP1, и он не скомпилировал

#include <list>

struct Url
{
    std::string name;
    std::list<Url> children;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Url u1,u2;
    u1.children.push_back(u2);
    return 0;
}

Возможно, вы забыли включить список?

РЕДАКТИРОВАТЬ

OP использует Visual Studio 6.0, и Нил смог подтвердить, что это действительно ошибка в VS6

5
ответ дан 9 December 2019 в 20:48
поделиться

Код отлично компилируется с GCC 4.4. И выполняет отлично. MSVC ++ до версии 7 не полностью соответствовал стандартам. Вам следует подумать об использовании более нового компилятора.

0
ответ дан 9 December 2019 в 20:48
поделиться

Интересно - вы пытаетесь создать вектор или список неполного типа. Беглый взгляд на стандарт, я не могу найти ничего, говорящего о том, разрешено это или нет для типов контейнеров, включенных в стандартную библиотеку C ++. Любое решение могло бы показаться разумным:

Почему это может быть запрещено: Вы не можете объявить объект типа X внутри определения X .

Например, следующий код не может быть скомпилирован, потому что он создает бесконечно глубокую структуру данных:

struct X {
    X x;
};

Почему это может быть разрешено: Размер большинства контейнеров можно изменять, что требует определенного уровня косвенности (указатели) на фактические элементы данных на практике. Это' s законно объявить указатель на- X внутри определения X .

Как следует из последнего абзаца, обычный способ обойти эту проблему - использовать указатели или ссылки на X . Например, следующие два фрагмента компилируются отлично:

struct Y {
    Y* y;
};

struct Z {
    std::list<Z*> zl;
    std::vector<Z*> zv;
};

Кто-нибудь (хорошо, я имею в виду litb :-P) знает, каковы на самом деле требования к стандартным типам контейнеров?

0
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: