Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 16.08.2019
Сообщений: 6
1

Инициализация класса через многоточие

16.08.2019, 19:54. Показов 3038. Ответов 11
Метки нет (Все метки)

Пытаюсь воспользоваться библиотекой https://github.com/gosha20777/keras2cpp

Но не могу ее собрать. Писал автору https://github.com/gosha20777/keras2cpp/issues/16 но он отвечать не торопится.

Может тут мне чего подскажут.

Проблема заключается в том, что когда инициализируется класс Tensor через initializer list, то компилятор выдает на это ошибку C2440.

Кроме того, в шаблоне самого класса, редактор подчеркивает красным троеточие в 6 строке, с ошибкой E0029 (требуется выражение). Подозреваю что из этого и выходит ошибка C2440.

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Tensor {
        public:
            Tensor() = default;
            template <
                typename... Size,
                typename = std::enable_if_t<(... && std::is_integral_v<Size>)>>
            Tensor(Size ... sizes) {
                resize(static_cast<size_t>(sizes)...);
            }
 
          
    };
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2019, 19:54
Ответы с готовыми решениями:

Инициализация полей класса через vector<>
Здравствуйте, можете подсказать как правильно инициализировать поля класса, вот например есть класс...

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

Странная реализация класса - многоточие: стоит ли понимать это буквально?
Здравствуте! Читаю книгу Александреску по C++ и в листинге приводится вот такая строка: class...

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса)
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1;...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
11
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
16.08.2019, 19:57 2
Mukudori, студия какая? C++17 включен?
0
6587 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,419
Записей в блоге: 1
16.08.2019, 20:23 3
Цитата Сообщение от Mukudori Посмотреть сообщение
Может тут мне чего подскажут.
Проблема заключается в том, что когда инициализируется класс Tensor через initializer list, то компилятор выдает на это ошибку C2440.
Может ты покажешь весь код?
0
0 / 0 / 0
Регистрация: 16.08.2019
Сообщений: 6
16.08.2019, 20:39  [ТС] 4
Croessmah, студия 17. Если я не ошибаюсь c++17 там стоит по умолчанию

oleg-m1973, весь код лежит Здесь. Я просто подключаю model.h, ничего оттуда не использую, и проект валится на этапе сборки по причине, которую я указал выше
0
6587 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,419
Записей в блоге: 1
16.08.2019, 20:45 5
Цитата Сообщение от Mukudori Посмотреть сообщение
роблема заключается в том, что когда инициализируется класс Tensor через initializer list, то компилятор выдает на это ошибку C2440.
Кроме того, в шаблоне самого класса, редактор подчеркивает красным троеточие в 6 строке, с ошибкой E0029 (требуется выражение). Подозреваю что из этого и выходит ошибка C2440.
initializer_list вроде так не работает, там нужен явный конструктор Tensor(std::initializer_list<size_t> .......
0
0 / 0 / 0
Регистрация: 16.08.2019
Сообщений: 6
16.08.2019, 20:55  [ТС] 6
Получается в 6 строчке так должно быть?

C++
1
 typename = std::enable_if_t<(std::initializer_list<size_t> && std::is_integral_v<Size>)>>
0
6587 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,419
Записей в блоге: 1
16.08.2019, 21:00 7
Цитата Сообщение от Mukudori Посмотреть сообщение
Получается в 6 строчке так должно быть?
Нет, нужен второй конструктор
C++
1
Tensor(std::initializer_list<size_t> sizes) {
Добавлено через 1 минуту
А зачем его вообще инициализировать через initializer_list?
1
0 / 0 / 0
Регистрация: 16.08.2019
Сообщений: 6
16.08.2019, 21:08  [ТС] 8
А как тогда быть с многоточием, оно по прежнему будет считаться синтаксической ошибкой?

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А зачем его вообще инициализировать через initializer_list?
Не могу знать, такова задумка автора библиотеки. Я просто не хочу все ломать
0
6587 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,419
Записей в блоге: 1
16.08.2019, 21:51 9
Лучший ответ Сообщение было отмечено Mukudori как решение

Решение

Цитата Сообщение от Mukudori Посмотреть сообщение
А как тогда быть с многоточием, оно по прежнему будет считаться синтаксической ошибкой?
Это не в многоточии ошибка, а когда ты передаёшь в конструктор неправильные аргументы

Добавлено через 5 минут
Можешь сделать
C++
1
2
3
4
    template <typename... Size>
    Tensor(Size... sizes) 
    {
        static_assert((... && std::is_integral_v<Size>), "Required integral type");
Добавлено через 31 минуту
Только не забывай, что это нифига не одно и то же, что typename = std::enable_if_t<(... && std::is_integral_v<Size>)>.
В случае со static_assert могут возникнуть проблемы, если ты захочешь сделать другие конструкторы.
1
0 / 0 / 0
Регистрация: 16.08.2019
Сообщений: 6
18.08.2019, 16:51  [ТС] 10
Я удалил все темплейты, переписал инициализацию и ввод параметров через vector<size_t>, теперь на переписанные фунции компилятор выкидывает ошибку LNK4006

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Tensor {
        public:
            Tensor() = default;
           
 
            Tensor(std::vector<size_t> sizes) {
                resize(sizes);
            }
 
            Tensor(Stream& file, size_t rank = 1);
 
          
            static auto empty(std::vector<size_t> sizes);
            void resize(std::vector<size_t> sizes) noexcept;
 
      std::vector<size_t> dims_;
            std::vector<float> data_;
    };
0
0 / 0 / 0
Регистрация: 16.08.2019
Сообщений: 6
19.08.2019, 19:42  [ТС] 11
Пофиксил. Нужно было прописать тело функций внутри класса. Пока проект собирается без ошибок, но я еще не юзал из библиотеки ни одной функции.

Добавлено через 1 час 11 минут
Отлично! Тестовая модель нейронки работает под движком UE4. На этом тему можно закрыть. Спасибо огромное за подсказки.
0
6587 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,419
Записей в блоге: 1
19.08.2019, 21:05 12
Цитата Сообщение от Mukudori Посмотреть сообщение
Я удалил все темплейты, переписал инициализацию и ввод параметров через vector<size_t>,
А как у тебя вообще вызывается конструктор для этого Tensor, и зачем? Из того, что ты показал, лучше сделать
C++
1
Tensor(std::initializer_list<size_t> sizes)
Добавлено через 1 минуту
А из того, что ты показал ещё -
Tensor(std::vector<size_t> sizes) {
resize(std::move(sizes));
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2019, 21:05

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

Инициализация экземпляра класса, как поле другого класса
Всем доброго времени суток ! Есть класс: class a{ public: a(int _type): type(_type) {} ...

Инициализация членов дочернего класса членами класса родителя
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами...

BST дерево. Инициализация класса внутри класса
Здравствуйте, нужно реализовать класс дерева бинарного поиска с использованием итератора. Возник...

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса Date,мне нужно,чтобы...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.