我正在使用 STM32 的硬件计时器与许多光学编码器连接。我想创建一个模板化类,它为与硬件计时器交互提供了一个方便的接口。定时器寄存器是存储器映射的,它们的地址在制造商提供的与器件数据表相匹配的标头中定义。模板参数实际上是定时器外设的基本内存地址。下面是我目前正在尝试做的一个最小的工作示例:
#include <cstdint>
// Effectively supplied by chip manufacturer headers
struct timer_peripheral {
volatile uint32_t count;
// ... lots of other registers ...
};
// Also supplied by chip manufacturer headers
#define TIM1 ((timer_peripheral *) 0x40000000)
#define TIM2 ((timer_peripheral *) 0x40000400)
// My templated class
template <timer_peripheral * Timer>
class OpticalEncoderCounter {
OpticalEncoderCounter();
};
template <timer_peripheral * Timer>
OpticalEncoderCounter<Timer>::OpticalEncoderCounter()
{
}
int main()
{
// option 1
OpticalEncoderCounter<TIM1> encoder0;
// option 2
timer_peripheral * t = TIM2;
OpticalEncoderCounter<t> encoder1;
}
但是,当我编译时,我使用 g++-4.7.2 -std=c++11 得到这些错误:
错误| 无法将模板参数“1073742848u”转换为“timer_peripheral*”</p>
错误| 't' 不是有效的模板参数,因为 't' 是一个变量,而不是变量的地址
在阅读了有关非类型模板参数的信息后,我仍然不确定如何解决我的问题以及是否可以按照我的想法使用模板。我在选项 1 中尝试了 static_cast 和 reinterpret_cast,但似乎没有任何区别。