【发布时间】:2021-04-14 17:34:36
【问题描述】:
我有一个方法需要多个相同枚举类型的变量。为了让编译器检测我是否传递了错误的参数,我使用了BOOST_STRONG_TYPEDEF。但是,当我创建一个实例并在 IF 语句中进行比较时,我遇到了一个段错误。
Boost 版本是 1.74
enum class Testable
{
UNDEFINED,
A,
B
};
BOOST_STRONG_TYPEDEF(Testable, SomeType)
int main()
{
SomeType abc{Testable::UNDEFINED};
std::cout << "START" << std::endl;
if(abc == Testable::UNDEFINED) // Seg faults here
{
volatile int j = 0;
}
std::cout << "FINISH" << std::endl;
}
GDB 回溯表明这是堆栈溢出/递归调用:
#1 0x00007ffff74c5d9d in boost::operators_impl::operator== (y=@0x7fffffcc9e44:
#2 0x00007ffff74c5d9d in boost::operators_impl::operator== (y=@0x7fffffcc9e44:
#3 0x00007ffff74c5d9d in boost::operators_impl::operator== (y=@0x7fffffcc9e44:
#4 0x00007ffff74c5d9d in boost::operators_impl::operator== (y=@0x7fffffcc9e44:
#5 0x00007ffff74c5d9d in boost::operators_impl::operator== (y=@0x7fffffcc9e44:
#6 0x00007ffff74c5d9d in boost::operators_impl::operator== (y=@0x7fffffcc9e44:
BOOST_STRONG_TYPEDEF 的文档不多。是不是我用错了?
Boost 版本是 1.74。我正在使用 Clang。
【问题讨论】:
-
既然
enum class本身就是一个强类型,我不清楚为什么需要在它上面加上一些其他的“强类型定义”。 -
@SamVarshavchik 我有一个函数处理 4 个该类型的实例。他们有上下文差异。为了防止传递错误的实例,我使用 Boost Strong Type 来有效地创建“子类型”。
-
Hmm... 我只想声明四个包含此
enum class实例的structs 作为它们唯一的成员,定义一个默认的==和!=运算符,以及一个构造函数吞下枚举类(可能没有必要,这要归功于 C++ 中的聚合初始化)。