В настоящее время в Webstorm 2017.3 имеется ошибка, которая препятствует установке библиотек Javascript через ‘Предпочтения | Языки и Рамки | JavaScript | Библиотеки | Скачайте и установите метод.
Это отслеживается здесь, и последняя версия EAP (Ранний предварительный доступ) (Webstorm 2017.3.2 на момент написания статьи) устраняет проблему. https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FWEB-29725
Я несколько часов стучал головой об стену, надеюсь, это поможет кому-то еще.
Если вам нужна рабочая среда для того, что кажется ошибкой 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;
};
Я не вижу никакой возможной причины, по которой это не должно быть законным.
Вы можете сказать нам, какой компилятор вы используете? Нет ничего плохого в том, что вы делаете. Я попробовал следующее на 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
Код отлично компилируется с GCC 4.4. И выполняет отлично. MSVC ++ до версии 7 не полностью соответствовал стандартам. Вам следует подумать об использовании более нового компилятора.
Интересно - вы пытаетесь создать вектор
или список
неполного типа. Беглый взгляд на стандарт, я не могу найти ничего, говорящего о том, разрешено это или нет для типов контейнеров, включенных в стандартную библиотеку 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) знает, каковы на самом деле требования к стандартным типам контейнеров?