【发布时间】:2010-08-13 16:30:08
【问题描述】:
假设我有一个这样定义的类“代码”,用户指定的类型转换为 int:
class Code
{
public:
int code;
std::string description;
Code (const int c, const std::string& d) : code(c), description(d) { ; }
operator int() const { return code; }
};
还有一个使用代码类的第二类“大师”:
class Master
{
public:
Code master_code;
};
还有一堆预先指定的代码,像这样:
const Code CODE_ONE (1, "This is code one");
const Code CODE_TWO (2, "This is code two");
const Code CODE_THREE (3, "This is code three");
人们会认为(即我会认为)可以这样使用它:
Master master_obj;
switch (master_obj.master_code)
{
case CODE_ONE:
// ...
break;
case CODE_TWO:
// ...
break;
case CODE_THREE:
// ...
break;
default:
// ...
}
由于自动将类型转换为 int,但显然情况并非如此。 GCC 告诉我 CODE_ONE、CODE_TWO 和 CODE_THREE“不能出现在常量表达式中”。
顺便说一句,这也不起作用:
Master master_obj;
switch (master_obj.master_code)
{
case CODE_ONE.code:
// ...
break;
case CODE_TWO.code:
// ...
break;
case CODE_THREE.code:
// ...
break;
default:
// ...
}
上面返回完全相同的错误:“'CODE_ONE' 不能出现在常量表达式中”除了一个“'。”不能出现在常量表达式中”。
但这确实有效:
Master master_obj;
switch (master_obj.master_code)
{
case 1:
// ...
break;
case 2:
// ...
break;
case 3:
// ...
break;
default:
// ...
}
所以 CODE_ONE 等不能被解析为常量表达式?这似乎很奇怪......还是我做错了什么?
【问题讨论】:
标签: c++ types expression switch-statement constants