就必须根据here 的答案之一输入Card::Rank::TEN 而言,您应该可以改用Card::TEN,前提是您像这样声明您的enum:
class Card
{
public:
enum Rank { TWO = 2, THREE = 3, FOUR = 4, FIVE = 5, SIX = 6, SEVEN = 7,
EIGHT = 8, NINE = 9, TEN = 10, JACK = 10,
QUEEN = 10, KING = 10, ACE = 11 };
无论如何,您都不能在switch 语句中使用两个相同的值。这是因为当代码运行并且您获得值 10 时,您的代码将无法确定它是十、杰克、皇后还是国王。
要么更改值,要么在您的开关中仅使用其中一个。这是一个人为的例子:
int function(int value)
{
int rv = 0;
switch (value)
{
case 0:
rv = 7;
break;
case 1:
rv = 8;
break;
case 1:
rv = 21;
break;
default:
rv = 0;
break;
}
return rv;
}
int main()
{
printf("What does function(1) return? %d", function(1));
return 0;
}
这是没有意义的,因为我们在传递值1 时返回两个不同的值,因此编译器不允许这样做。
如果你在 switch 中使用 Card::Rank::TEN 的 enum 值也是一样的,因为它们的 值 与编译器不允许的相同。
Card::Rank card = Card::Rank::TEN;
switch(card)
{
// Some cases...
case Card::Rank::JACK:
// Do something
break;
case Card::Rank::TEN: // <- not allowed since it is the same as the case for Card::Rank::JACK.
// Do something else
break;
// Some more cases...
}
这是不允许的。以下似乎应该没问题,因为编译器应该能够看到在两种情况下运行的是相同的代码,但它仍然无法工作。
switch(card)
{
// Some cases...
case Card::Rank::JACK:
case Card::Rank::TEN: // <- still not allowed, even though both code paths for case 10 do the same thing...
// Do something else
break;
// Some more cases...
}
很抱歉,我无法对此给出充分的理由,除了标准本身可能不允许这样做以保持一致性。其他人可能能够详细说明这一点。