оператор std :: string == не работает - PullRequest
4 голосов
/ 11 мая 2010

Я годами использую оператор std :: string's == для Windows и Linux. Сейчас я собираю одну из моих библиотек на Linux, она использует == интенсивно. В Linux следующая функция завершается ошибкой, потому что == возвращает false, даже когда строки равны (с учетом регистра равны)

const Data* DataBase::getDataByName( const std::string& name ) const
{
         for ( unsigned int i = 0 ; i < m_dataList.getNum() ; i++ )
         {
                if (  m_dataList.get(i)->getName() == name )
                {
                         return  m_dataList.get(i);
                }
         }

         return NULL;
}

Метод getName () объявлен следующим образом

virtual const std::string& getName() const;

Я строю с помощью gcc 4.4.1 и libstdc ++ 44-4.4.1.

Есть идеи? это выглядит совершенно справедливо для меня.

Пол

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Я едва мог видеть какие-либо проблемы с вашим кодом. Кажется, что источник ошибки находится в другом месте.

Полагаю, вы возвращаете ссылку на локальную переменную.

См. Мой пример:

#include <iostream>

using std::string;

const string& getString()
{
    string text("abc");
    return text;
}

int main() {
    string text("abc");
    std::cout << (getString() == text ? "True" : "False") << "\n";
    return 0;
};

Вывод на мою машину:

False

Однако в некоторых средах я получал исключительный вывод. Это неверный код, но поведение не определено. Видимо, часто это работает правильно.

Следите за предупреждениями компиляции, такими как:

a.cpp:7: warning: reference to local variable ‘text’ returned

Вы также можете попробовать скомпилировать свой код с опцией "-Wall" и посмотреть, указывают ли предупреждения на реальные проблемы.

1 голос
/ 12 мая 2010

(снято в темноте, поскольку я не вижу ничего плохого в вашем примере кода)

Возможно, ваш оператор равенства перегружен в другом месте? Помимо пошагового просмотра кода, еще одним способом является явный вызов оператора равенства, которого вы пытаетесь достичь из std ::. Например:

#include <iostream>

int main(void)
{
    const std::string lhs = "hello";
    const std::string rhs = "hello";

    if (lhs == rhs)
    {
        std::cout << "Matches" << std::endl;
    }

    if (std::operator==( lhs, rhs ) == true)
    {
        std::cout << "Matches 2" << std::endl;
    }

    return 0;
}

Должен вывести:

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