C++;使用模板的编译时检查器 我有以下的代码,这是现代C++设计中的代码。当我使用它时,我得到了补偿错误,我认为Operand的大小无效。谁能指出问题出在哪里。谢谢 template<bool> struct CompileTimeChecker { CompileTimeChecker(...); }; template<> struct CompileTimeChecker<false> { }; #define STATIC_CHECK(expr, msg) \ {\ class ERROR_##msg {}; \ (void)sizeof(CompileTimeChecker<(expr) != 0>((ERROR_##msg())));\ } template <class To, class From> To safe_reinterpret_cast(From from) { STATIC_CHECK(sizeof(From) <= sizeof(To), Destination_Type_Too_Narrow); return reinterpret_cast<To>(from); } int main(void) { int a[20]; void* somePointer = a; char c = safe_reinterpret_cast<int>(somePointer); } 模板 结构编译器{ 编译机(…); }; 模板 结构编译器{ }; #定义静态检查(expr,msg)\ {\ 类错误u##msg{}\ (void)sizeof(CompileTimeChecker((ERROR####msg())\ } 模板 安全重新解释演员阵容(来自){ 静态检查(sizeof(From)d:\technical\c++study\readparsing\readparsing\addressconv.cpp(37):请参阅正在编译的函数模板实例化“to safe_reinterpret_cast(From)”的参考 1> 与 1> [ 1> To=int, 1> From=无效* 1> ] 1> d:\technical\c++study\readparsing\readparsing\addressconv.cpp(29):错误C2070:“CompileTimeChecker(安全重新解释\u转换::错误\u目标\u类型\u太窄(\uu cdecl*)(void)):操作数大小非法 1> 与 1> [ 1> 形式=真 1> ]

C++;使用模板的编译时检查器 我有以下的代码,这是现代C++设计中的代码。当我使用它时,我得到了补偿错误,我认为Operand的大小无效。谁能指出问题出在哪里。谢谢 template<bool> struct CompileTimeChecker { CompileTimeChecker(...); }; template<> struct CompileTimeChecker<false> { }; #define STATIC_CHECK(expr, msg) \ {\ class ERROR_##msg {}; \ (void)sizeof(CompileTimeChecker<(expr) != 0>((ERROR_##msg())));\ } template <class To, class From> To safe_reinterpret_cast(From from) { STATIC_CHECK(sizeof(From) <= sizeof(To), Destination_Type_Too_Narrow); return reinterpret_cast<To>(from); } int main(void) { int a[20]; void* somePointer = a; char c = safe_reinterpret_cast<int>(somePointer); } 模板 结构编译器{ 编译机(…); }; 模板 结构编译器{ }; #定义静态检查(expr,msg)\ {\ 类错误u##msg{}\ (void)sizeof(CompileTimeChecker((ERROR####msg())\ } 模板 安全重新解释演员阵容(来自){ 静态检查(sizeof(From)d:\technical\c++study\readparsing\readparsing\addressconv.cpp(37):请参阅正在编译的函数模板实例化“to safe_reinterpret_cast(From)”的参考 1> 与 1> [ 1> To=int, 1> From=无效* 1> ] 1> d:\technical\c++study\readparsing\readparsing\addressconv.cpp(29):错误C2070:“CompileTimeChecker(安全重新解释\u转换::错误\u目标\u类型\u太窄(\uu cdecl*)(void)):操作数大小非法 1> 与 1> [ 1> 形式=真 1> ],c++,most-vexing-parse,C++,Most Vexing Parse,另一个最令人烦恼的问题是 sizeof(CompileTimeChecker<(expr) != 0>((ERROR_##msg())) 正如Foo(Var)可以解释为一种类型(函数接受一个类型(函数没有参数返回一个Var)和返回一个Foo),事实就是如此。正如一位程序员指出的那样,(void)sizeof并没有被编译器吞没。我建议从sizeof中删除括号,如下所示: (void)sizeof CompileTimeChecker<(expr) != 0>((ERROR

另一个最令人烦恼的问题是

sizeof(CompileTimeChecker<(expr) != 0>((ERROR_##msg()))

正如Foo(Var)可以解释为一种类型(函数接受一个类型(函数没有参数返回一个Var)和返回一个Foo),事实就是如此。

正如一位程序员指出的那样,(void)sizeof并没有被编译器吞没。我建议从sizeof中删除括号,如下所示:

(void)sizeof CompileTimeChecker<(expr) != 0>((ERROR_##msg()));\
编译器的大小((ERROR####msg())\ 这似乎让g++接受了它,并以它可能的本意来解释它

如果(void)sizeof一直给您带来麻烦,您也可以在没有它的情况下获得静态检查功能,例如通过初始化CompileTimeChecker变量:

CompileTimeChecker<(expr) != 0> a((ERROR_##msg()));\
CompileTimeChecker a((ERROR####msg())\

我猜这是一个典型机器上的64位编译?如果是这样,
void*
很可能是8个字节,而
int
将是4个字节,这就抵消了断言。这与问题有什么关系,你能解释一下“非法操作数大小”吗错误。sizeof可以将类型作为参数,但不能作为函数类型。这就是您错误地给出它的原因。
Foo((int())
不是函数类型。“参数”周围有一对参数,这使它不是参数声明。啊,nvm,它是绑定括号。我错了:)
CompileTimeChecker<(expr) != 0> a((ERROR_##msg()));\