Вот такой незамысловатый код. Хочу использовать в качестве параметра шаблона адрес регистра, заданный численно.
#define PORT_A (uint32_t*)0xAABBCCDD
template<uint8_t PIN, uint32_t* ptr>
class _PIN {
public:
};
template<>
class _PIN< 12, PORT_A> {};
void setup() {}
void loop() {}
Можно загнать в Ардуино ИДЕ и скомпилировать для любой платы, хоть для Уно. Выдает ошибку:
sketch_jul28a:7:36: error: '52445' is not a valid template argument for 'uint32_t* {aka long unsigned int*}' because it is not the address of a variable
template<> class _PIN< 12, PORT_A> {};
^
exit status 1
То есть как это “не адрес переменной”?! а что это???
Если выбрать какую-нить плату позаковыристей, типа СТМ32 - добавляется еще одна ошибка
sketch_jul28a:1:17: error: reinterpret_cast from integer to pointer
#define PORT_A (uint32_t*)0xAABBCCDD
^~~~~~~~~~~~
Я так понимаю, что суть именно в этом - новые версии С++ запрещают кастить инт в адрес.
И как это обойти? Например в СТМ32 все адреса регистров заданы именно такими дефайнами, как в первой строке моего примера.