2008-11-21 65 views
4

定义为std::vector<std::string>载体, 奇怪,为什么以下是有效的:STL向量比较问题

if (vecMetaData[0] != "Some string") 
{ 
    ... 

但不是这样的:

switch (vecMetaData[1]) 
{ 
    ... 

Visual Studio中抱怨:

错误C2450 :开关表达式'std :: basic_string < _Elem,_Traits,_Ax>'是非法的 1>与 1> [ 1> _Elem =炭, 1> _Traits =标准:: char_traits, 1> _AX =标准::分配器 1>] 1>无可用的,可以执行此转换的用户定义转换运算符,或者不能调用运算符

回答

14

开关()需要一个积分型(如int,炭,...)

字符串不是整数类型,同样没有串具有的隐式转换为整型,所以它不能为在switch语句

2

只能将开关用于基本数据类型(int,char等)。

3

它是有效的,因为第一个会调用std :: string的运算符!=,它将接受一个const char *作为参数。然而,这并不意味着std :: string也有一个操作符some_integral_type(),它将返回一个切换需要的整型表达式。

在C++中使用运算符并不需要调用内置的含义。例如,您的代码不会比较指针值。它可能会调用一个用户定义的(在这种情况下是std :: string的)操作符函数。

1

用最简单的替代BTW是一个std::map<std::string, boost::function> StringSwitch;

这让你说StringSwitch["Some string"](arguments...)

1

如果你只是要检查每一件事情在载体中,你可以使用for_each标准库函数。或者,如果您想要对可能值的子集执行操作,请使用find_if获取匹配项的迭代器,然后使用循环或for_each对其执行操作。

1

这两者都不可能是你想要的无论如何...因为我假设你想使用std :: string :: compare函数来进行字符串比较