这是我多年来一直感激访客后在此平台上的第一个问题。请对我好一点。
我目前正在为ADC实现一个接口,该接口可以与不同类型的微控制器和不同体系结构一起使用。
遗憾的是,这将可用的c ++版本限制为11,以保证MCU之间的兼容性。
这个想法是定义一个通用的API ADC结构,在其中传递固定宽度整数类型的类型名,以及ADC可以实现的最大Min和Max值。这两个值旨在存储为constexpr。
因此,我想到了这个:
template<typename T, T max, T min>
struct ADC
{
public:
static constexpr T maximum = max;
static constexpr T minimum = min;
virtual void reset() = 0;
// ...
};
template<typename T, T max, T min>
struct xyzAdc : ADC<typename T, T max, T min>
{
public:
uint8_t someSpecificADCStuff = 0xac; // arbitrarily chosen
// ....
};
例如,可能有一个提供12位分辨率的ADC。可以在单端或差分模式下使用,这会导致如下用法:
xyzADC<uint16_t, 0, 4095> singleEndedADC;
// or
xyzADC<int16_t, -2048, 2047> diffADC;
不幸的是,这无法编译。产生的错误消息是
error: wrong number of template arguments (1, should be 3)
struct xyzAdc : ADC<typename T, T max, T min>
说实话,我无法找到此错误消息所暗示的内容。 我做了一些研究,但未能找到类似的问题,该问题已涵盖在内。
我在做什么错? c ++ 11是否提供另一种方法来实现我要执行的操作? 这通常是合理的模式/想法吗? 还是我应该写另一个包装这些参数的模板?
对于包括深度阅读在内的任何帮助或提示的信息,将不胜感激。 预先感谢。
编辑: 固定代码中的整数类型大小,错字与问题无关
答案 0 :(得分:0)
也许
template<typename T, T max, T min>
struct xyzAdc : ADC<T, max, min> // no "<typename T, T max, T min>"
{ // ...............^..^^^..^^^
public:
uint8_t someSpecificADCStuff = 0xac; // arbitrarily chosen
// ....
};
?
无论如何,4095
对于std::uint8_t
来说太多了
xyzADC<uint8_t, 0, 4095> singleEndedADC;