Метод c ++ unordered_set .find не компилируется, выдает ошибку «выражение должно иметь тип класса» - PullRequest
0 голосов
/ 31 августа 2018

Итак, я пытаюсь написать функцию, которая может определить, сколько строк в коллекции являются анаграммами других строк в этой коллекции. Чтобы сделать это быстро, я решил отсортировать строки, а затем переместить их в " действительный "и" недействительный "хэш-набор, в зависимости от того, нашел ли я дубликат. Проблема в том, что когда я пытаюсь использовать метод find для unordered_sets, я получаю ошибку времени компиляции, которая говорит мне, что" выражение должно иметь тип класса ".

Я просмотрел веб-сайт, но я не увидел ни одной записи с такой ошибкой, которую я признал той же проблемой.

Я работаю в Visual Studio, в C ++, и я должен отметить, что код не закончен; Я ничего не написал после строки, которая дает мне ошибку. Кроме того, именно имя std :: unordered_set "valid" подчеркнуто красным.

Стоит также отметить, что этот код находится в стадии разработки, поэтому записано несколько вещей, которые мне могут не понадобиться; например, я, вероятно, не буду в конечном итоге использовать эти длинные long (потому что я понял, что попытка использовать один огромный массив символов, а не строки, вероятно, требует больше усилий, чем оно того стоит).

Вот метод, над которым я работаю:

Редактировать: Я удалил некоторые нерелевантные части этого метода из-за чувствительности его происхождения. Я прошу прощения за отсутствие предвидения.

int Anagram_Locator::filterAnagrams()
{
    ...

    //the valid and invalid hash sets
    std::unordered_set<std::string> valid();
    std::unordered_set<std::string> invalid();
    //pull in the words, and sort them. Then, send them to either the valid or invalid string hash sets
    while (std::cin >> transferString)
    {

        ...

        //is it in the valid list?
        std::unordered_set<std::string>::const_iterator found = valid.find (transferString);

    }
}

Последняя строка в этом фрагменте кода - это та, которая не компилируется. Это особенно расстраивает меня, потому что написано именно так, как было в этом руководстве по c ++:

Ссылочная страница C ++, которую я просматривал

Я бы подумал, что это весь код, который мне понадобится, но опыт научил меня, что проблемы программирования часто имеют причины в частях кода, которые, я думаю, не имеют значения. Поэтому я разместил оставшуюся часть кода ниже.

Редактировать: остальная часть кода оказалась неактуальной, поэтому я удалил ее для ясности.

1 Ответ

0 голосов
/ 31 августа 2018

Это выглядит неправильно:

std::unordered_set<std::string> valid();
std::unordered_set<std::string> invalid();

Вы объявляете две функции, которые возвращают наборы, а не два набора.

Разве ты не хочешь:

std::unordered_set<std::string> valid;
std::unordered_set<std::string> invalid;
...