dynamic_cast在assert中导致错误
dynamic_cast in assert Causing Error
我使用的是过时的Visual Studio 2008(让我为您省去麻烦"这就是您的问题")。这似乎是一个问题与Visual Studio: http://rextester.com/XKFR77690这似乎是一个问题与assert
宏:http://ideone.com/bhxMi0
给定这些结构体:
struct base { virtual ~base() {} };
template <typename T>
struct Foo : base { T foo; };
我可以这样做:
base* test = new Foo<pair<int, int>>;
if(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL) cout << "hello worldn";
但是当我在assert
: assert(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL)
中使用与if
-语句完全相同的代码时,我得到一个错误:
警告C4002:宏
assert
的实际参数太多
语法错误:缺少',' before ')'
顺便说一句,我可以通过使用c风格的cast来解决这个问题:assert((Foo<pair<int, int>>*)(test) != NULL)
,但我认为c风格的cast会做static_cast
而不是dynamic_cast
,这是我不想要的。
是的:宏将顶级逗号视为参数分隔符。最简单的修复方法是在问题代码周围加上括号:
assert((dynamic_cast<Foo<pair<int, int>>*>(test)) != NULL)
或者,如果你喜欢,在整个内容周围加上括号:
assert((dynamic_cast<Foo<pair<int, int>>*>(test) != NULL))
问题中的c风格强制转换编译的原因不是它是c风格强制转换,而是它将模板代码放在括号中,因此逗号不再位于最外层。
assert
是一个宏。它由预处理器处理,预处理器对c++结构一无所知。所以如下:
assert(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL)
展开为一个类函数的宏,接受两个参数,在本例中是:
dynamic_cast<Foo<pair<int
和
int>>*>(test) != NULL
请记住,类函数的宏参数用逗号分隔。这就是预处理器所看到的。所以在这种情况下,它看到2个参数,而不是assert
要求的1个参数。
由于括号的优先级高于逗号,您的c风格强制转换版本顺带起作用。把它们放在dynamic_cast
周围也可以。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 自定义"assert"宏,支持逗号和错误消息
- 带有 QT 错误的 OpenGL:ASSERT:"QOpenGLFunctions::isInitialized(d_ptr)" 。无法创建 OpenGL 上下文
- 在 cv::imshow() 中获取错误 - ASSERT:在文件 qasciikey.cpp 中"false",第 501 行
- Assert()函数抛出一个错误——操作符有问题
- dynamic_cast在assert中导致错误
- assert、-NDEBUG和分段错误