【发布时间】:2014-04-06 20:17:18
【问题描述】:
我正在尝试设计一个类来表示一张卡,我决定使用枚举来表示等级和花色。但是,我需要能够从用户那里获取输入,不幸的是,不可能直接从 cin 获取枚举。
出于这个原因,我打算接收一个字符串并使用std::map 将每个字符串映射到它所代表的枚举值(如this question 中所述)。我也不希望我的输入区分大小写,所以我创建了一个正则表达式,它应该在匹配之前将所有字符转换为小写。
我想出的代码在这里:
istream& operator>>(istream& is, Card& d)
{
std::map<std::string,Card::Rank> mr;
std::map<std::string,Card::Suit> ms;
mr[std::regex("/two/i")] = Card::TWO;
mr[std::regex("/three/i")] = Card::THREE;
mr[std::regex("/two/i")] = Card::FOUR;
mr[std::regex("/two/i")] = Card::FIVE;
mr[std::regex("/two/i")] = Card::SIX;
mr[std::regex("/two/i")] = Card::SEVEN;
mr[std::regex("/two/i")] = Card::EIGHT;
mr[std::regex("/two/i")] = Card::NINE;
mr[std::regex("/two/i")] = Card::TEN;
mr[std::regex("/two/i")] = Card::JACK;
mr[std::regex("/two/i")] = Card::QUEEN;
mr[std::regex("/two/i")] = Card::KING;
ms[std::regex("/clubs/i")] = Card::CLUBS;
ms[std::regex("/diamonds/i")] = Card::DIAMONDS;
ms[std::regex("/hearts/i")] = Card::HEARTS;
ms[std::regex("/spades/i")] = Card::SPADES;
string srank, ssuit;
char c1;
if (is >> srank >> c1 >> ssuit)
{
if (c1 == 'of')
{
Card::Rank rank = mr[srank];
Card::Suit suit = ms[ssuit];
d = Card(rank, suit);
}
else
{
is.clear(ios_base::failbit);
}
}
return is;
}
但是,在编译时我收到此错误:
error C2679: binary '[' : no operator found which takes a right-hand operand of type 'std::basic_regex<_Elem>' (or there is no acceptable conversion)
with
[
_Elem=char
]
c:\program files (x86)\microsoft visual studio 11.0\vc\include\map(173): could be 'Card::Rank &std::map<_Kty,_Ty>::operator [](std::basic_string<_Elem,_Traits,_Alloc> &&)'
with
[
_Kty=std::string,
_Ty=Card::Rank,
_Elem=char,
_Traits=std::char_traits<char>,
_Alloc=std::allocator<char>
]
c:\program files (x86)\microsoft visual studio 11.0\vc\include\map(190): or 'Card::Rank &std::map<_Kty,_Ty>::operator [](const std::basic_string<_Elem,_Traits,_Alloc> &)'
with
[
_Kty=std::string,
_Ty=Card::Rank,
_Elem=char,
_Traits=std::char_traits<char>,
_Alloc=std::allocator<char>
]
while trying to match the argument list '(std::map<_Kty,_Ty>, std::basic_regex<_Elem>)'
with
[
_Kty=std::string,
_Ty=Card::Rank
]
and
[
_Elem=char
]
etc.
我以前从未使用过地图,我并没有真正理解我做错了什么;根据我设法挖掘的说明,在我看来这应该可行。
【问题讨论】:
-
char c1; ... if (c1 == 'of')我希望你看到这段代码有问题。 -
@PaulMcKenzie:好的,所以这可能是糟糕的代码。但是,我认为这不是导致错误的原因......
标签: c++ regex enums operator-overloading