![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
Здравствуйте, вопрос в следующем:
Почему нельзя передать параметры функции в качестве аргументов шаблона, если эта функция constexpr Пример:
Почему List... не является константой, если вся функция constexpr? -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Замени 'static const int v = 0;' на enum { v = 0 };
|
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
дело не в static const - это я просто упростил пример, на самом деле там идет рекурсивный темплейт.
он не может передать входные параметры в качестве параметров темплейта. он пишет: 'List#1' is not a constant expression. в функцию можно передать все что угодно, в том числе и в рантайме и строить на этом этапе темплейт уже поздно. но я помечаю, что вся функция является константой и должна выполняться на этапе компиляции, но компилятор этого не понимает. я и хочу спросить, как можно объяснить компилятору, что входные параметры являются константами? -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
покажи компилябельный код воспроизводящий ошибку.
|
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
задача в следующем: есть такой шаблонный класс битов типа TSet, на основе его создаются классы перечня ошибок и др. он естественно имеет всякие методы. так вот, мне нужно создать объект типа TError с какими то предустановленными битами, указанными в конструкторе. вот этот конструктор я и пытаюсь написать. шаблон _SFlags объединяет биты на основе списка аргументов и сохраняет их в статическую переменную. конструктор класса SFlags сохраняет в поле Flags значение v шаблона _SFlags передавая туда входные аргументы конструктора. Конструктор SFlags обязательно должен быть constexpr, чтобы разместить данные в кодовой памяти при компиляции. Это сообщение отредактировал(а) Ivan. - 6.9.2012, 18:35 -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это не совсем то, чего я ожидал.
добавь main(), добавь пример использования... Добавлено через 1 минуту и 8 секунд и кто такие eBreakSensor2, eMaxTemperature ? как этот код может называться компилябельным? |
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
я пишу системы автоматического управления различных протекающих процессов в основном для контроллеров.
eBreakSensor1, eBreakSensor2, wMinPressure, eMaxTemperature - это перечень каких либо флагов, в частности аварий и предупреждений в системе. eBreakSensor1 - обрыв датчика 1; eBreakSensor2 - обрыв датчика 2; wMinPressure - предупреждение минимального давления; eMaxTemperature - авария по максимальной температуре; eCOUNT - число флагов в енуме.
Добавлено @ 19:11 забыл, еще есть такая переменная текущих флагов ошибок: TError Errors; куда помещаются текущее состояние системы. я не буду описывать всю систему, откуда они берутся и как туда попадают Это сообщение отредактировал(а) Ivan. - 6.9.2012, 19:13 -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
решил!!! заменил рекурсивную структуру на рекурсивную функцию:
Вывод: в шаблон можно загонять только типы, и чистые данные базовых типов и енумов без каких либо преобразований (int)Value, где Value является long, и значений, возвращаемых какими либо функциями, даже если они constexpr. Это сообщение отредактировал(а) Ivan. - 6.9.2012, 20:19 -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
| Ivan. |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
Беда. получилась следующая аказия: в классе появился конструктор с неопределенным числом неопределенного типа аргументов.
Задача. необходимо создать копию объекта, что мы делаем:
Что делает компилятор: - видит доступный конструктор с неограниченным числом аргументов - тип подходит, количество аргументов тоже; - входит в него; - встречает операцию 1LL << Value, где Value является типом TError; - пытается его к чему нибуть преобразовать, чтобы получить число; - встречает оператор bool() - пойдет; - в итоге вместо копии происходит инициализация массива битов установкой первого бита. Выход: создать конструктор копии
это все хорошо, но что делать, если поле Flags не long long, а массив char?
Копировать через цикл - не хорошо. Вопрос, как можно проинициализировать массив? -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
в С++11 кажется есть возможность использовать дефолтовый конструктор:
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |