我的代码如下: 我使用函数指针来创建模板类对象。为什么我这样做是因为我的比较器类Less使用成员函数来显示结果。但是如果我用operator()定义一个类,它将产生一个错误,即内部类不能访问外部类的非静态成员。所以我会使用一个函数来创建模板参数。
#include <iostream>
using namespace std;
template <typename Comp>
class Compare{
private:
int a[10]{1,2,3,4,5,6,7,8,9,0};
public:
// class Less{ //use inner class, can't visit the member function in OuterClass like java. so we'd use a function pointer to initialize the template
// public:
//
// };
bool Less(int v1, int v2){
return a[v1] < a[v2];
}
private:
Comp comp;
public:
void compare(int v1, int v2){
cout << comp(v1, v2);
}
};
int main()
{
Compare<&Compare::Less> c;
c.compare(1, 2);
}
但是,我收到如下错误:
In function 'int main()':
[Error] template argument 1 is invalid
[Error] invalid type in declaration before ';' token
[Error] request for member 'compare' in 'c', which is of non-class type 'int'
真的想知道原因。 THX:!)
答案 0 :(得分:0)
使用仿函数执行此操作的简单方法是,您只想重载operator()并将数组作为私有成员放在仿函数中,并将此仿函数创建为main中的实例以调用它:
#include <iostream>
using namespace std;
class Comparator{
private:
int a[10]{1,2,3,4,5,6,7,8,9,0};
public:
bool operator()(int v1, int v2) const{
return a[v1] < a[v2];
}
};
int main(){
Comparator less;
cout<<less(1,2)<<endl;
}
如果你正在为Dijkstra算法编写比较器,你应该定义一个简单的函数指针而不将数组作为私有成员只是重载operator()而不是传入你定义的min_heap中的数组或向量,可以找到类似的方法在std :: priority_queue
中 template<class Comparable>
Comparator<Comparable> comp;
std::priority_queue<Comparable, vector<Comparable>, Comparator<Comparable>> pq(comp,a);
希望它有所帮助。
答案 1 :(得分:0)
<强>原因:强>
&Compare::Less
不是类型,而模板需要类型。它的值为bool (Compare::*)(int, int)
。您可以安全地使用decltype(&Compare::Less)
。
<强>设计强>
设计看起来很脆弱,因此模板的问题可能不是解决的正确问题。
另外,我是@ R.Sahu所说的,试着重新审视基本面。
对于算法实现,我建议您从boost.graph
中汲取灵感