Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 78
#1

Почему не компилируется list.push_back( double[3] ) ? - C++

10.07.2015, 10:34. Просмотров 626. Ответов 21
Метки нет (Все метки)

А почему компилятор отказывается добавлять в список массив?

C++
1
2
3
4
5
6
std::list<double[3]>    lst;   // у компилятора нет замечаний
 
double  arr[3] = { 0 };
 
lst.push_back( arr );   //  а здесь выдает error C2075: Target of operator new():
//для инициализации массива требуются фигурные скобки
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,113
10.07.2015, 10:41     Почему не компилируется list.push_back( double[3] ) ? #2
Попробуйте как то так
C++
1
2
3
4
5
std::list<double *>    lst;
 
double  arr[3] = { 0 };
 
lst.push_back( arr );
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 78
10.07.2015, 10:55  [ТС]     Почему не компилируется list.push_back( double[3] ) ? #3
Так-то работает, но это у меня получится список указателей на временные переменные, а я то мечтал создать список массивов.
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
10.07.2015, 11:07     Почему не компилируется list.push_back( double[3] ) ? #4
C++
1
2
3
4
5
6
struct a{double arr[3];};
std::list<a>    lst;
 
a  arr = { 0 };
 
lst.push_back( arr );
А вот так должно работать
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
10.07.2015, 11:10     Почему не компилируется list.push_back( double[3] ) ? #5
Как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <array>
#include <vector>
using namespace std;
 
int main() {    
    vector<array<double, 3>> lst;
    
    array<double, 3> arr {5.0, 6.0, 7.0};
    
    lst.push_back(arr);
    
    cout << lst[0][0] << endl; // 5
    
    return 0;
}
Пример работы
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,113
10.07.2015, 11:10     Почему не компилируется list.push_back( double[3] ) ? #6
а я то мечтал создать список массивов.
мда
C++
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
29
30
31
32
33
34
35
#include <iostream>
#include <list>
 
 
int main(int argc, char** argv) {
    
    const size_t size = 3;
    double * arr1 = new double[size];
    arr1[0] = 1.0;
    arr1[1] = 2.0;
    arr1[2] = 3.0;
    
    double * arr2 = new double[size];
    arr2[0] = 1.0;
    arr2[1] = 2.0;
    arr2[2] = 3.0;
    
    std::list<double *> list;
    
    list.push_back(arr1);
    list.push_back(arr2);
    
    for(std::list<double *>::iterator it = list.begin(); it != list.end(); ++it)
    {
        for(int j = 0; j < size; ++j)
            std::cout << (*it)[j]<< " ";
        std::cout << std::endl;
    }
        
     list.clear();
    delete [] arr1;
    delete [] arr2;
 
    return 0;
}
Voivoid
 Аватар для Voivoid
593 / 269 / 12
Регистрация: 31.03.2013
Сообщений: 1,328
10.07.2015, 11:13     Почему не компилируется list.push_back( double[3] ) ? #7
Лишняя структурка не нужна, есть же std::array

C++
1
2
3
4
  std::array<double, 3> arr = { 0.0, 0.0, 0.0 };
 
  std::list<std::array<int, 3>> l;
  l.push_back(arr);
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 78
10.07.2015, 11:31  [ТС]     Почему не компилируется list.push_back( double[3] ) ? #8
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
C++
1
2
3
4
struct a{double arr[3];};
std::list<a> lst;
a arr = { 0 };
lst.push_back( arr );
А вот так должно работать
Спасибо, работает. Только всё же хотелось бы знать, почему без обёртки в структуру не работает, и замедлит ли работу программы добавление этой обёртки?

Добавлено через 3 минуты
Цитата Сообщение от egor2116 Посмотреть сообщение
мда
Чего мда? Это и я так могу, спасибо конечно за труд. Просто здесь я не хотел бы связываться с new / delete.

Добавлено через 9 минут
Цитата Сообщение от Voivoid Посмотреть сообщение
Лишняя структурка не нужна, есть же std::array

C++
1
2
3
std::array<double, 3> arr = { 0.0, 0.0, 0.0 };
std::list<std::array<int, 3>> l;
 l.push_back(arr);
Я использую в программе typedef double point[3]. Я не знаю, может быть для C++ это не очень хороший стиль?
Voivoid
 Аватар для Voivoid
593 / 269 / 12
Регистрация: 31.03.2013
Сообщений: 1,328
10.07.2015, 11:33     Почему не компилируется list.push_back( double[3] ) ? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от VIKT0R Посмотреть сообщение
Я использую в программе typedef double point[3]. Я не знаю, может быть для C++ это не очень хороший стиль?
Да дело даже не в стиле, а в том, что в C++ нельзя массивы передавать по значению.
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
10.07.2015, 14:16     Почему не компилируется list.push_back( double[3] ) ? #10
Цитата Сообщение от VIKT0R Посмотреть сообщение
Спасибо, работает. Только всё же хотелось бы знать, почему без обёртки в структуру не работает, и замедлит ли работу программы добавление этой обёртки?
Нет не замедлит. Не работает потому что в С++ любой массив это указатель. Кстати часто приходится делать такие списки именно структур, так как данные в наборе разнородные.
Voivoid
 Аватар для Voivoid
593 / 269 / 12
Регистрация: 31.03.2013
Сообщений: 1,328
10.07.2015, 14:38     Почему не компилируется list.push_back( double[3] ) ? #11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
что в С++ любой массив это указатель
Ага, а любой стол - это стул. Ну а что, на стол же тоже можно сесть
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
10.07.2015, 15:45     Почему не компилируется list.push_back( double[3] ) ? #12
Цитата Сообщение от Voivoid Посмотреть сообщение
Ну а что, на стол же тоже можно сесть
И не только стул но еще и кровать, на него можно еще и лечь.
А любой массив в С++ - это указатель на его начало.
Voivoid
 Аватар для Voivoid
593 / 269 / 12
Регистрация: 31.03.2013
Сообщений: 1,328
10.07.2015, 16:03     Почему не компилируется list.push_back( double[3] ) ? #13
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А любой массив в С++ - это указатель на его начало.
Старые песни о главном

Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
http://ideone.com/eWKQUE
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
10.07.2015, 16:47     Почему не компилируется list.push_back( double[3] ) ? #14
Цитата Сообщение от Voivoid Посмотреть сообщение
Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
потому что значение адреса const.
Voivoid
 Аватар для Voivoid
593 / 269 / 12
Регистрация: 31.03.2013
Сообщений: 1,328
10.07.2015, 16:51     Почему не компилируется list.push_back( double[3] ) ? #15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
потому что значение адреса const.
О, ну тогда что же это? константный указатель присвается неконстантному указателю?

http://ideone.com/eWKQUE
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
10.07.2015, 17:29     Почему не компилируется list.push_back( double[3] ) ? #16
Цитата Сообщение от Voivoid Посмотреть сообщение
О, ну тогда что же это? константный указатель присвается неконстантному указателю?
Да. Точно так же как значение константы присваивается переменной.
Voivoid
 Аватар для Voivoid
593 / 269 / 12
Регистрация: 31.03.2013
Сообщений: 1,328
10.07.2015, 17:35     Почему не компилируется list.push_back( double[3] ) ? #17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да. Точно так же как значение константы присваивается переменной.
Кхм, э-э-э, ну ок, допустим. Почему тогда здесь ошибка компиляции-то?

http://ideone.com/eWKQUE
lss
919 / 849 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
10.07.2015, 17:39     Почему не компилируется list.push_back( double[3] ) ? #18
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
в С++ любой массив это указатель.
Массив - это массив: непрерывный именованный участок памяти, содержащий данные одного типа; имя массива (non-modifiable) lvalue, в некоторых случаях ,может быть раложено (decay) к rvalue: "указателю на первый элемент массива" (что, в частности, происходит в формальных параметрах функций).
Указатель - переменная, содержащая адрес.
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
10.07.2015, 17:45     Почему не компилируется list.push_back( double[3] ) ? #19
Цитата Сообщение от Voivoid Посмотреть сообщение
Кхм, э-э-э, ну ок, допустим. Почему тогда здесь ошибка компиляции-то?
Просит явно привести тип
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 17:54     Почему не компилируется list.push_back( double[3] ) ?
Еще ссылки по теме:

C++ ааааааааааааааааа, почему не компилируется?
Почему не компилируется? C++
Про list push_back C++
Почему не компилируется C++
Почему не компилируется с шаблонами? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Voivoid
 Аватар для Voivoid
593 / 269 / 12
Регистрация: 31.03.2013
Сообщений: 1,328
10.07.2015, 17:54     Почему не компилируется list.push_back( double[3] ) ? #20
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Просит явно привести тип
Ну так почему же в одном случае ошибка, а в другом - нет?
Yandex
Объявления
10.07.2015, 17:54     Почему не компилируется list.push_back( double[3] ) ?
Ответ Создать тему
Опции темы

Текущее время: 21:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru