头文件是“graph.h”
#ifndef _GRAPH_H_
#define _GRAPH_H_
#include <map>
#include <vector>
using namespace std;
template <class T>
class VERTEX
{
public:
VERTEX(T inVertex): m_vertex(inVertex), m_visited(false){}
~VERTEX(){}
private:
T m_vertex;
bool m_visited;
};
template <class T>
class GRAPH
{
public:
GRAPH() {}
~GRAPH(){}
typedef VERTEX<T> GRAPHVERTEX;
typedef vector<GRAPHVERTEX> ADJLIST;
typedef map<GRAPHVERTEX, ADJLIST> GRAPHMAP;
void insert(GRAPHVERTEX inSRC, GRAPHVERTEX inDST)
{
GRAPHMAP::iterator itr = m_graph.find(inSRC);
}
private:
GRAPHMAP m_graph;
};
#endif
测试文件是
#include "graph.h"
int main( int argc, char**argv)
{
GRAPH<int> *G = new GRAPH<int>();
G->insert(VERTEX<int>(0), VERTEX<int>(2));
return 0;
}
答案 0 :(得分:3)
有两个问题。
首先,您必须在insert
中限定依赖类型:
void insert(GRAPHVERTEX inSRC, GRAPHVERTEX inDST)
{
typename GRAPHMAP::iterator itr = m_graph.find(inSRC);
}
其次,你需要一个&lt;顶点类的运算符。在VERTEX的公共部分添加:
bool operator<(const VERTEX<T>& right) const { return m_vertex < right.m_vertex; }
作为一种风格注意事项,在C ++中,所有CAPS名称通常都是为常量保留的。对于你的班级来说,Vertex
会更加正常。另请注意,在标题中包含using namespace
可能会产生许多不需要的和不可预测的结果,具体取决于包含顺序,应该完全避免。
typename
关键字告诉编译器它实际上是一种类型。
要注意的第二件事是map
是一个有序容器,因此你需要传入一个比较函数或提供一个&lt;运算符为map
的键。由于VERTEX
是地图密钥,因此我设置了operator<
,以便对对象进行排序并维护订单。您可能需要在VERTEX
班级演变时调整比较运算符。
答案 1 :(得分:1)
您无法使用GRAPHVERTEX作为键创建地图,因为您需要能够将键与运算符&lt;进行比较。所以你必须定义这个运算符。
答案 2 :(得分:0)
您的VERTEX类用作地图中的键;它需要定义一个“less”运算符。
答案 3 :(得分:0)
要使用类作为地图中的键,您必须为该类型定义operator<
,否则您需要在创建地图时指定比较器。假设该类型的对象具有“自然”顺序,您通常希望使用它来实现operator<
。当您需要以多个不同的顺序排列给定类型的对象时,通常使用单独的比较器对象,并且没有一个订单实际上比其他订单更“自然”或占优势(例如,与员工合作时,您可能会看起来通过社会安全号码,姓名和资历,他们大致相同。