c ++中的模板化比较函数

时间:2012-10-14 23:44:16

标签: c++ templates

我有以下比较函数,我传递给std::sort算法来对对象矢量进行排序:

template <typename PointT>
bool myCompareLines (A<PointT>::model_struct model_a, A<PointT>::model_struct model_b) {
    return (/* some comparison code*/);
}

比较函数在类之外声明,我这样称它为:

template <typename PointT>
class B {
    [...]
    std::sort(lines.begin().lines.end(),::myCompareLines);
    [...]
}

当我编译时,我收到错误:template declaration of 'bool myCompareLines'

class A内,我将class B声明为朋友类,以便class B可以 访问私有类型model_struct。我错过了什么?

4 个答案:

答案 0 :(得分:2)

虽然很可怕,这个你在寻找什么?注意:编译不等于好。即使这对您有用,我也建议另一种方式来声明您的层次结构。

template<class PointT>
class A
{
public:
    A() {};

    struct model_stuct
    {
        // need something to use in comparison, so i just threw this in.
        int value;
    };
};

// comparitor
template<class PointT>
bool compareLines(
    const typename A<PointT>::model_stuct& left,
    const typename A<PointT>::model_stuct& right)
{
    return left.value < right.value;
}

template<class PointT>
class B
{
public:
    B() : lines() {};

    void sort()
    {
        std::sort(lines.begin(), lines.end(), compareLines<PointT>);
    }

    std::vector<typename A<PointT>::model_stuct> lines;
};


// main entrypoint
int main(int argc, char *argv[])
{
    // this does nothing, but demonstrate that it can compile and
    //  sort() doesn't puke. 
    B<int> bInt;
    bInt.sort();
    return 0;
}

答案 1 :(得分:1)

你不应该这样做:

template <typename PointT>
class B {
    [...]
    std::sort(lines.begin(), lines.end(), ::myCompareLines<PointT>);
    [...]
}

答案 2 :(得分:1)

我在CompareLines签名中缺少typename关键字。

这解决了它:

bool myCompareLines (typename A<PointT>::model_struct model_a, typename B<PointT>::model_struct model_b)

答案 3 :(得分:0)

编译器无法从内部类PointT中推断出模板参数A<PointT>::model_struct

它不能,因为A<PointT>的许多专业化可以具有相同的model_struct - 如:

template <class PointT>
class A {
public:
  typedef int model_struct;
};

这个例子:

   int a;
   bool res = compareLines(a,a);

model_struct定义为顶级模板。