2008-11-21 91 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函數來進行字符串比較