【发布时间】:2011-01-24 16:20:49
【问题描述】:
我有这个模板类:
template <class Tin, class Tout>
class Foo
{
Tin input;
Tout output;
static inline void __ensure_type_consistency
{
int16_t* p = (int16_t *)0;
// uint16_t* p1 = p;
Tin* check_type_in = p;
Tout* check_type_out = p;
}
public:
...
}
我想确保 Tin 和 Tout 都是 typedef 类型以键入 int16_t 而不是其他类型。 (注意: 请在下结论之前阅读完整的问题)
如果我取消注释注释行,我会得到预期的错误;编译器不允许不同类型的指针在没有强制转换的情况下相互分配:
"src\foo.h", line 47: error #145: a value of type "int16_t *"
cannot be used to initialize an entity of type "uint16_t *"
但如果我把它注释掉,我会实例化:
Foo<uint16_t, int32_t> illegalFoo;
即使使用相同类型的检查,我也没有收到编译器错误(在从未实际调用的静态函数中创建不兼容的指针分配,但这会导致编译器错误)
有没有办法创建静态编译时类型一致性检查?为什么我使用的那个不起作用?
注意:暂时忽略摆脱模板参数的明显解决方案。这将“解决”这个问题,但是我的调试工具在这里发生了一些带外的事情,其中 typedef 被用于传递重要的元数据:我想确保 Foo.input 的类型为 Tin Tin 是 int16_t 或解析为 int16_t 的 typedef,与 Foo.output 和 Tout 类似。从我的调试工具的角度来看,存在细微差别,可以区分 typedef 的类型和它们的基类型,即使在 C++ 程序中它们是相同的。
编辑:顺便说一句,这是一个嵌入式系统,我不能使用 Boost。它也不是 C++0x。
【问题讨论】:
-
啊!双下划线名称 == 为编译器保留...
-
错误消息告诉您,您将
uint16_t作为参数传递给模板,而不是int16_t。您要执行的确切一致性检查是什么?是否要同时允许uint16_t和int16_t?这是一个错字吗(提供的代码中还有其他错误)? -
为什么不能在嵌入式系统上使用 Boost?我目前正在嵌入式医疗系统上使用它。
-
@GrahamS:这是一个 TI C28xxx DSP。有嵌入式系统,然后有嵌入式系统。功能更强大的通常具有兆字节的 RAM,并且能够运行操作系统(例如嵌入式 Linux 或智能手机)。我与那些有
-
Foo
只是在 __ensure_type_consistency() 上给出了替换失败,所以它没有被实例化。在 Foo 上没有替换失败,所以它被编译了,然后你在 "uint16_t* p1 = p;" 上得到编译器错误