Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / type-rich инициализация / 25 сообщений из 74, страница 1 из 3
10.11.2019, 23:42
    #39887258
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
что-то не догоню (опять на ночь глядя), как проинициализировать такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
struct Test
{
    int i;
};

struct S
{
    int a,b;
    Test t;
};

int main()
{
    vector<S> s;
    s.push_back({1,2, Test{5}});
// error: no matching function for call to ‘std::vector<S>::push_back(<brace-enclosed initializer list>)’
// и так тоже не:
    s.push_back({1,2, 5});
// а так да (если из S Test убрать):
    s.push_back({1,2});
}


ЧЯДНТ?
...
Рейтинг: 0 / 0
10.11.2019, 23:53
    #39887260
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух,

Должно работать. И так тоже должно:
Код: plaintext
1.
	s.push_back({ 1,2, {5} });
...
Рейтинг: 0 / 0
10.11.2019, 23:56
    #39887262
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух,

древний конпилятор!
...
Рейтинг: 0 / 0
11.11.2019, 12:50
    #39887420
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
а, блин, что C++17 нужен же
...
Рейтинг: 0 / 0
11.11.2019, 14:58
    #39887502
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
ёёёёё
полудух,

древний конпилятор!
gcc компилирует с С++11 без проблем
...
Рейтинг: 0 / 0
11.11.2019, 18:51
    #39887693
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
у меня g++ v6 не компилировал
v8.3 - ok
...
Рейтинг: 0 / 0
11.11.2019, 21:56
    #39887756
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
а тоже самое, но в таком виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct Test
{
    int i;
};

struct S_in
{
    int a,b;
};

struct S : S_in
{
    Test t;
};


выдаёт такую же ошибку...
вроде в S должен получиться такой же набор: a,b,i
ан нет... что-то ему не нравится
...
Рейтинг: 0 / 0
11.11.2019, 22:52
    #39887771
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух
а тоже самое, но в таком виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct Test
{
    int i;
};

struct S_in
{
    int a,b;
};

struct S : S_in
{
    Test t;
};



выдаёт такую же ошибку...
вроде в S должен получиться такой же набор: a,b,i
ан нет... что-то ему не нравится

Вгде "такая же" ошибка?
...
Рейтинг: 0 / 0
11.11.2019, 23:10
    #39887772
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух,

MS VS 2017, C++ Langusge Standard: ISO C++17 Standard (/std:c++17)
...
Рейтинг: 0 / 0
11.11.2019, 23:15
    #39887773
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух,

mingw 8.2.0, если set(CMAKE_CXX_STANDARD 17)

- тоже "всё работает".
...
Рейтинг: 0 / 0
11.11.2019, 23:20
    #39887774
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
вот сук, ему -std=c++1z надо было дать
а если наследование убрать, то и без работает
...
Рейтинг: 0 / 0
12.11.2019, 01:06
    #39887813
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух
вот сук, ему -std=c++1z надо было...


C++ 11 = > C++1x
C++ 14 = > C++1y
C++ 17 = > C++1z
...
C++ 20 => C++2a :)
...
Рейтинг: 0 / 0
12.11.2019, 17:59
    #39888204
Z axis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух
вот сук, ему -std=c++1z надо было дать
а если наследование убрать, то и без работает
Ну, это неудивительно. До C++17 агрегат вообще не мог иметь базовых классов.
...
Рейтинг: 0 / 0
12.11.2019, 18:35
    #39888223
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
чего не мог иметь?
может наследоваться не мог?
...
Рейтинг: 0 / 0
12.11.2019, 20:15
    #39888270
Z axis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух
чего не мог иметь?
может наследоваться не мог?
В чём разница с тем, что сказал я?
...
Рейтинг: 0 / 0
12.11.2019, 23:02
    #39888305
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
в терминологии запутался
я привык их называть "родительский класс"
а "агрегатом" классы вообще никто не называет
...
Рейтинг: 0 / 0
12.11.2019, 23:05
    #39888306
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
ёёёёё
полудух
вот сук, ему -std=c++1z надо было...


C++ 11 = > C++1x
C++ 14 = > C++1y
C++ 17 = > C++1z
...
C++ 20 => C++2a :)

остаётся только гадать, почему нельзя было назвать c++14, c++17
...
Рейтинг: 0 / 0
12.11.2019, 23:07
    #39888307
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух,

чтобы духи лажали....
...
Рейтинг: 0 / 0
13.11.2019, 00:17
    #39888325
vAH_O6Vg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух
остаётся только гадать, почему нельзя было назвать c++14, c++17

Потому что это разные режимы компиляции. Буквенные стандарты - это частичная реализация черновиков новых стандартов. Стандарт двадцатого года ещё дописывается, а -std=c++2a уже есть. Для уже вышедших и полностью реализованных нужно писать -std=c++17, -std=c++14 и т.д.
...
Рейтинг: 0 / 0
13.11.2019, 01:55
    #39888342
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
ок.
тем временем, я нашёл новый косяк

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
struct Test
{
    int i;
};

struct S_in
{
    vector<int> z;
    int a,b;
};

struct S : S_in
{
    vector<int> y;
    Test t;
    vector<int> bb;
};

int main()
{
    vector<S> s;
    s.push_back({vector<int>{345},1,2, {22}, Test{"abc",5}, {5,6,12}});
}


{345} НЕ работает без vector<int>, хотя и "y", и "bb" без проблем добавляются...
error: no matching function for call to ‘std::vector<S>::push_back(<brace-enclosed initializer list>)’
...
Рейтинг: 0 / 0
18.11.2019, 18:24
    #39890745
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
не пойму, что не клеится...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
struct Slova
{
    string w1, w2;
};

int main()
{
    vector<Slova> *v;
    vector<Slova> v1 {{"Слово1", "Слово2"},   {"Слово3", "Слово4"}};
    vector<Slova> v2 {{"Дело1", "Дело2"},   {"Дело3", "Дело4"}};

    // я хочу, чтобы v получал v1 ЛИБО v2 (каждый раз будет выбираться новый), и чтобы получал по ссылке
    // move() тут не годится, т.к. v1 и v2 должны выжить для будущих подключений.
    // пытаюсь сделать так:
    vector<Slova> *v = &v1;
    // и так:
    v = &v1;

    // но на попытку:
    cout << *v[1].w1 << endl;
    // выгребаю: error: ‘class std::vector<ent::Slova>’ has no member named ‘w1’
    // (тоже самое и без *)

    // НО вот так всё ок:
    for (auto &s : *v)
        {cout << s.w1 << endl;} // шо за?!

}
...
Рейтинг: 0 / 0
18.11.2019, 20:05
    #39890786
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
так тоже ок:
cout << v1[1].w1 << endl;
...
Рейтинг: 0 / 0
18.11.2019, 21:35
    #39890811
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
полудух,

Код: plaintext
1.
(*v)[1].w1
...
Рейтинг: 0 / 0
18.11.2019, 21:38
    #39890816
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
а
Код: plaintext
1.
*v[1].w1


означает
Код: plaintext
1.
*((*(v+1)).w1)
...
Рейтинг: 0 / 0
18.11.2019, 21:58
    #39890823
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type-rich инициализация
охх...
а что означают все эти скобочки? (где-то там кроется dereferencing, я полагаю)
зачем надо было так усложнять то, голову же сломать можно


и ведь это единственный правильный способ по ссылке привязать?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / type-rich инициализация / 25 сообщений из 74, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]