【问题标题】:C++, using std::sort on a vector of class pointers - OR I can't name my functions properlyC++,在类指针向量上使用 std::sort - 或者我无法正确命名我的函数
【发布时间】:2025-12-09 00:50:02
【问题描述】:

实际问题:我将我的函数命名为'sort',它在没有指定std的情况下调用了sort,现在我觉得很愚蠢。

解决方案:重命名我的函数并从现在开始显式调用 std::sort (就像我的教授以外的每个人都建议我这样做)。

我试图通过根据该类中的字符串对类(Song)指针的向量(cat)进行排序来找出 std::sort。

我正在专门尝试调整此解决方案std::sort() on a vector of Class pointers,但没有成功。

我能想到的最好的是:

void Catalog::sort()
{
       sort(cat.begin(), cat.end(), compareTitle );
       return;
}
bool compareTitle(Song* a, Song* b)
{
        return(a->getTitle().compare(b->getTitle()) < 0);
}

这里的 compareTitle 不是类函数。编译器返回

catalog.cpp: In member function ‘void Catalog::sort()’:
catalog.cpp:62:44: error: no matching function for call to ‘Catalog::sort(std::vector<Song*>::iterator, std::vector<Song*>::iterator, bool (&)(Song*, Song*))’
   62 |  sort(cat.begin(), cat.end(), compareTitle );
      |                                            ^
catalog.cpp:59:6: note: candidate: ‘void Catalog::sort()’
   59 | void Catalog::sort()
      |      ^~~~~~~
catalog.cpp:59:6: note:   candidate expects 0 arguments, 3 provided

我也试过

void Catalog::sort()
{
      sort(cat.begin(), cat.end(), [](Song* a, Song* b){
           return(a->getTitle().compare(b->getTitle()) < 0);
           });
        return;
}

这给了我

catalog.cpp: In member function ‘void Catalog::sort()’:
catalog.cpp:66:7: error: no matching function for call to ‘Catalog::sort(std::vector<Song*>::iterator, std::vector<Song*>::iterator, Catalog::sort()::<lambda(Song*, Song*)>)’
   66 |     } );
      |       ^
catalog.cpp:59:6: note: candidate: ‘void Catalog::sort()’
   59 | void Catalog::sort()
      |      ^~~~~~~
catalog.cpp:59:6: note:   candidate expects 0 arguments, 3 provided

感谢任何建议;我的搜索没有结果。

【问题讨论】:

  • 也许你忘记了“using namespace std;”或“#include

标签: c++ sorting stl


【解决方案1】:

您正在为名称查找的工作方式而苦恼。在Catalog::sort 中,当您使用不合格的sort 时,编译器会再次生成Catalog::sort - 成员函数会尝试调用自身。但是由于函数签名不匹配,编译器会报错。

您可以通过明确地为您的呼叫添加前缀来解决此问题,即

std::sort(cat.begin(), cat.end(),
    [](const Song *lhs, const Song *rhs) { /* ... */ });

请注意,这里的 lambda 是要走的路,传递成员函数指针(如在您的第一个示例中)不会像这样工作。

最后,确保包含 &lt;algorithm&gt; 标头。

【讨论】:

    【解决方案2】:

    在这两种情况下,您都想调用std::sort(),但您进行的调用不符合which您想要的sort(),因此编译器看到最近的sort() 是@ 987654324@ 并尝试再次调用它,但由于参数不匹配而失败。

    在电话前面加上std::,例如:

    void Catalog::sort()
    {
        std::sort(...);
    }
    

    话虽如此,在这两个示例中,无论您对 std::sort() 谓词使用函数还是 lambda,其 return 语句都可以简化为:

    return a->getTitle() < b->getTitle();
    

    如果第一个参数“小于”第二个参数,则谓词应返回 true。假设 getTitle() 返回一个 std::string,它的原生 operator&lt; 会为您返回准确的结果。无需手动调用compare()

    【讨论】: