我有以下比较函数,我传递给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
。我错过了什么?
答案 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
定义为顶级模板。