C++ 中的模板化比较函数
templated comparison function in c++
我有以下比较函数传递给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
。 我错过了什么?
虽然很丑陋,但这是你要找的吗?注意:编译不等于好。即使这对您有用,我也会建议另一种声明层次结构的方法。
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;
}
你不应该只做:
template <typename PointT>
class B {
[...]
std::sort(lines.begin(), lines.end(), ::myCompareLines<PointT>);
[...]
}
我的 CompareLines 签名中缺少 typename 关键字。
这可以修复它:
bool myCompareLines (typename A<PointT>::model_struct model_a, typename B<PointT>::model_struct model_b)
编译器
无法从内部类A<PointT>::model_struct
推断模板参数PointT
。
它不能,因为A<PointT>
的许多专业化可以具有相同的model_struct
- 例如:
template <class PointT>
class A {
public:
typedef int model_struct;
};
有了这个例子:
int a;
bool res = compareLines(a,a);
将model_struct
定义为顶级模板。
相关文章:
- C++自定义比较函数
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 如何定义集合数组的比较函数?
- 根据比较函数C++对数组进行排序
- 使用自定义比较函数在类内进行列表排序
- 如何更改 std::set 的比较函数?
- 使用类似的比较函数时,在 c++ 中为 std:sort 获得不同的结果
- std::映射服装比较函数和函数/lambda错误
- 在C++排序中为比较函数指定参数
- 使用右值的比较函数
- 为什么比较函数类型需要指定为模板参数?
- 我应该将 lambda 或函子用于比较函数吗?
- 比较函数模板中的 VARTYPE 和 typeid().name / typename
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 无法在 std::sort 中使用 cdef 函数作为比较函数
- 关联容器,比较函数不是元素类型的一部分吗?
- 标准::lower_bound的比较函数
- 关于如何在 std::sort 和 std::p riority_queue 中使用自定义比较函数的困惑