реклама на сайте
подробности

 
 
> С++ Объявить вариантное перечисление., Шаблонами.
AHTOXA
сообщение Jul 1 2013, 10:49
Сообщение #1


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Есть у меня файл, типа spi.h, в нём - перечисление всех имеющихся SPI:
Код
enum SpiNum {
    SPI_1,
#if (SPI_COUNT>1)
    SPI_2,
#elif (SPI_COUNT>2)
    SPI_3
#endif
};

Захотелось мне избавиться от дефайнов, и переделать это на шаблоны.
Делаю так:
Код
template<int SPI_Count> struct SpiEnumTraits;
template<> struct SpiEnumTraits<1> { enum SpiNum { SPI_1 }; };
template<> struct SpiEnumTraits<2> { enum SpiNum { SPI_1, SPI_2 }; };
template<> struct SpiEnumTraits<3> { enum SpiNum { SPI_1, SPI_2, SPI_3 }; };
template<> struct SpiEnumTraits<4> { enum SpiNum { SPI_1, SPI_2, SPI_3, SPI_4 }; };

typedef typename SpiEnumTraits<chip::spi_count>::SpiNum SpiNum;

На саму эту конструкцию компилятор не ругается, а вот на любые упоминания в тексте программы элементов перечисления (SPI_1 и т. д.) - ругается, мол, символ неопределён. Видимо, я что-то делаю неправильно, но вот что?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
XVR
сообщение Jul 2 2013, 08:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(AHTOXA @ Jul 1 2013, 14:49) *
Делаю так:
Код
template<int SPI_Count> struct SpiEnumTraits;
template<> struct SpiEnumTraits<1> { enum SpiNum { SPI_1 }; };
typedef typename SpiEnumTraits<chip::spi_count>::SpiNum SpiNum;

На саму эту конструкцию компилятор не ругается, а вот на любые упоминания в тексте программы элементов перечисления (SPI_1 и т. д.) - ругается, мол, символ неопределён.
Правильно ругается - у вас enum получился локальным в классе, а typedef наружу вынес сам enum, а не его элементы. Делайте так
Код
typedef SpiEnumTraits<chip::spi_count> SPI;

... SPI::SPI_1 ...

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 2 2013, 08:49
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Так я тоже пробовал, и это тоже не работает:
Код
if (spiNum == SpiNum::SPI_1)
...

error: 'SpiNum' is not a class or namespace.
sad.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 2 2013, 08:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(AHTOXA @ Jul 2 2013, 12:49) *
Так я тоже пробовал, и это тоже не работает:
Код
if (spiNum == SpiNum::SPI_1)
...

error: 'SpiNum' is not a class or namespace.
sad.gif
SpiNum должен быть typedef'ом на весь класс, а не на его внутренний enum

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 2 2013, 09:10
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А, пардон, я невнимательно прочитал. Да, так работает, но это не то, что я хотелsm.gif
Писать (дописывать) в куче мест лишний префикс - неохота. Хотелось найти полный эквивалент варианту с define.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AHTOXA   С++ Объявить вариантное перечисление.   Jul 1 2013, 10:49
- - neiver   Если строчка: typedef typename SpiEnumTraits<ch...   Jul 1 2013, 17:40
|- - AHTOXA   Это я уже от безысходности добавил. И без typename...   Jul 1 2013, 18:50
- - Tahoe   Цитата(AHTOXA @ Jul 1 2013, 14:49) Кодenu...   Jul 5 2013, 19:29
|- - AHTOXA   Недавно вернулся к этой теме, но немного по другом...   Apr 11 2015, 07:25
|- - esaulenka   Цитата(AHTOXA @ Apr 11 2015, 10:25) Недав...   Apr 30 2015, 10:33
|- - AHTOXA   Цитата(esaulenka @ Apr 30 2015, 15:33) Во...   Apr 30 2015, 11:08
- - Сергей Борщ   Интересно, взял на заметку.   Apr 11 2015, 08:08
- - shreck   ОФФ. А мне вот интересно, IAR будет воплощать у се...   Apr 20 2015, 10:16
- - esaulenka   Это некорректный пример, так у меня тоже работает ...   Apr 30 2015, 12:54
|- - AHTOXA   Цитата(esaulenka @ Apr 30 2015, 17:54) Эт...   Apr 30 2015, 20:01
- - esaulenka   С автодополнением я понял, почему у меня не работа...   May 7 2015, 12:58
|- - AHTOXA   Цитата(esaulenka @ May 7 2015, 17:58) Что...   May 7 2015, 18:39
- - esaulenka   О, спасибо большое. Хватило одной __cxa_pure_virtu...   May 8 2015, 06:47


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 19:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016