在模板化类中使用STL算法(特别是std :: sort)

Dan*_*elD 2 c++ sorting templates stl

我已经将模板类MyContainer声明为贝娄,然后创建了一个类型为DataType1的实例.DataType1类提供了友元函数"DataSpecificComparison",std :: sort使用它来比较DataType1对象.该程序正确编译和排序.

然后我定义了一个名为DataType2的类,给它一个朋友实现"DataSpecificComparison"并用它来创建另一个MyContainer实例.

我现在无法将程序编译为" C2914:'std :: sort':无法推断模板参数,因为函数参数不明确 "报告编译时错误.

开发人员如何指定DataSpecificComparison二进制谓词采用模板类型T*的参数?或者还有另一种解决这个问题的方法吗?

template <class T>
class MyContainer
{
private: 
    vector<T*> m_vMyContainerObjects;
    ....

public:
    ....
    void SortMyContainerObjects()
    {
        std::sort(m_vMyContainerObjects.begin(), m_vMyContainerObjects.end(), DataSpecificComparison)
    }
}


class DataType1
{
    ....
    friend bool DataSpecificComparison(const DataType1 * lhs, const DataType1 * rhs)
}

class DataType2
{
    ....
    friend bool DataSpecificComparison(const DataType2* lhs, const DataType2* rhs)
}
Run Code Online (Sandbox Code Playgroud)

sth*_*sth 6

您可以使用所需类型的临时本地函数指针变量来选择正确的重载DataSpecificComparison:

void SortMyContainerObjects()
{
    typedef bool (*comparer_t)(const T*, const T*);
    comparer_t cmp = &DataSpecificComparison;
    std::sort(m_vMyContainerObjects.begin(), m_vMyContainerObjects.end(), cmp);
}
Run Code Online (Sandbox Code Playgroud)

在这里,编译器可以推断出您希望使用DataSpecificComparisoncomparer_t类型匹配的重载,从而解决了歧义.