Проблема сравнения векторов STL - PullRequest
4 голосов
/ 21 ноября 2008

С вектором, определенным как std::vector<std::string>, Хотите знать, почему действует следующее:

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

Но не это:

switch ( vecMetaData[1] )
{
    ...

Visual studio жалуется:

ошибка C2450: неправильное выражение типа 'std :: basic_string <_Elem, _Traits, _Ax>' 1> с 1> [ 1> _Elem = char, 1> _Traits = std :: char_traits, 1> _Ax = std :: allocator 1>] 1> Нет определенного пользователем оператора преобразования, который может выполнить это преобразование, или оператор не может быть вызван

Ответы [ 6 ]

15 голосов
/ 21 ноября 2008

switch () требуется целочисленный тип (например, int, char, ...)

строка не является целочисленным типом, и строка не имеет неявного преобразования в целочисленный тип, поэтому ее нельзя использовать в операторе switch

3 голосов
/ 21 ноября 2008

Это действительно, потому что первый вызовет оператор! = Of std :: string, который примет const char * в качестве аргумента. Это, однако, не означает, что std :: string также имеет оператор some_integral_type (), который будет возвращать интегральное выражение, в котором нуждается переключатель.

Использование операторов в C ++ не обязательно вызывает встроенное значение. Ваш код, например, не сравнивает значения указателя. Он может вызывать пользовательскую (в данном случае, операторную функцию std :: string).

2 голосов
/ 21 ноября 2008

Вы можете использовать переключатель только для базовых типов данных (int, char и т. Д.).

1 голос
/ 02 декабря 2008

ни то, ни другое, вероятно, не то, что вам нужно ... поскольку я предполагаю, что вы хотите использовать функцию std :: string :: compare для сравнения строк

1 голос
/ 21 ноября 2008

Если вы просто хотите проверить каждую вещь в векторе, вы можете использовать стандартную библиотечную функцию for_each. Или если вы хотите воздействовать на подмножество возможных значений, используйте find_if, чтобы получить итераторы для соответствующих элементов, а затем используйте цикл или for_each, чтобы воздействовать на них.

1 голос
/ 21 ноября 2008

Самая простая альтернатива, кстати, это std::map<std::string, boost::function> StringSwitch;

Это позволяет вам сказать StringSwitch["Some string"](arguments...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...