我有一个相当简单的测试,它在 travis-ci 持续集成服务器上失败了,但我无法重现失败。 CI 服务器似乎不支持 RTTI,但据我所知,在 gcc 上关闭 RTTI 是不可能的。
我想知道我是否在这里依赖未定义的行为,这就是导致差异的原因。谁能告诉我为什么这可能会不一致地失败?
#include <catch.hpp>
template <typename T, typename U>
T * As(U * Object)
{
return dynamic_cast<T *>(Object);
}
class Base
{
public:
Base() {}
virtual ~Base() {}
};
class Derived : public Base
{};
{
// in tests...
Derived b;
REQUIRE(As<Derived>((Base*)&b) == &b);
}
当我在各种架构上运行时,上面的测试总是通过,但在 travis-ci 上失败并进行以下扩展:
__null == 0x00007ffd6d95fe70
所以 As<Derived>((Base*)&b)
正在返回 null
虽然我期待它
返回一些非空值。我们可以明显地看到 b
实际上是一个 Derived
实例 - 我的各种强制转换和取消引用是否做错了什么?
最佳答案
我将此作为对问题的评论发布,但认为它应该在答案部分。事实证明,我有多个编译单元,其中包含名为 Base
和 Derived
的类,并且在链接时会导致冲突。更改类的名称解决了这个问题。
关于c++ - 仅在 travis-ci 上测试失败;不支持 RTTI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31693113/