c++ unordered_set .find 方法无法编译,给出“表达式必须具有类类型”错误

Posted

技术标签:

【中文标题】c++ unordered_set .find 方法无法编译,给出“表达式必须具有类类型”错误【英文标题】:c++ unordered_set .find method won't compile, gives "expression must have class type" error 【发布时间】:2018-08-31 02:30:25 【问题描述】:

所以,我正在尝试编写一个函数,该函数可以确定一个集合中有多少个字符串是该集合中其他字符串的变位词。为了快速做到这一点,我选择对字符串进行排序,然后将它们移动到 " 有效”和“无效”哈希集,取决于我是否找到了重复。问题是,当我尝试对 unordered_sets 使用 find 方法时,我收到一个编译时错误,告诉我“表达式必须具有类类型”。

我浏览了该网站,但没有看到任何包含我认为是相同问题的错误的帖子。

我在 Visual Studio 中工作,使用 C++,我应该提一下代码还没有完成;在给我错误的那一行之后,我没有写任何东西。另外,红色下划线的就是 std::unordered_set "valid" 的名称。

同样值得注意的是,这段代码是一个正在进行中的工作,所以写了一些我可能实际上不需要的东西;例如,我可能最终不会使用那些 long 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);

    

这段代码 sn-p 的最后一行是不编译的。这对我来说尤其令人沮丧,因为它的编写方式与本 c++ 指南中的内容完全相同:

The c++ reference page I was looking at

我认为这就是我需要的所有代码,但经验告诉我,编程问题通常在我认为不相关的部分代码中产生原因。因此,我在下面发布了我的其余代码。

编辑:其余代码被证明是无关紧要的,所以为了清楚起见,我将其删除。

【问题讨论】:

您的代码受到the most vexing parse in C++ 的影响。 valid 不是 std::unoredered_set&lt;std::string&gt; 类型的对象。它是一个不带参数并返回std::unoredered_set&lt;std::string&gt; 的函数。 invalid也是这样的功能。 您可能会考虑将所有这些放在一个文件中,并删除任何不必要的导致问题的内容。在这样做时,您实际上可能会发现问题或至少缩小问题范围。这称为minimal reproducible example,非常有助于让其他人真正查看您的代码。代码散落在各处的故事方法,没有那么多。 好吧,我会删除无关的信息......在这种情况下,几乎就是所有信息。 (顺便说一句,为此道歉;我还是一个新程序员,所以我仍然不能很好地确定什么是相关的,什么是不相关的。 @RSahu -- 这不是“最令人头疼的解析”。它只是一个函数声明。 “最令人烦恼的解析”更加微妙。您链接到的***文章提供了示例;这不是其中之一。 @PeteBecker,它是最令人头疼的解析的最简单形式。它声明了一个函数,而意图是使用默认构造函数构造一个对象。 【参考方案1】:

这似乎不正确:

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

您声明了两个返回集合的函数,而不是两个集合。

你真的不想要:

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

【讨论】:

...大概就是这样。让我快速检查一下。 是的,就是这样。总是小事。谢谢。 如果您觉得有用,请不要忘记接受答案(或点赞,或两者兼而有之)。

以上是关于c++ unordered_set .find 方法无法编译,给出“表达式必须具有类类型”错误的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-3 无重复字符的最长字串(滑动窗口,unordered_set, st.find(string[i]))

leetcode-3 无重复字符的最长字串(滑动窗口,unordered_set, st.find(string[i]))

c ++ unordered_set .find方法不会编译,给出“表达式必须有类类型”的错误

C++之unordered_map和unordered_set以及哈希详解

C++之unordered_map和unordered_set以及哈希详解

在 c++ 中使用 unordered_set/map 时如何制作封装良好的类?