需要帮助,我不明白为什么下面的代码没有编译

时间:2010-09-28 20:32:33

标签: c++ stl

头文件是“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;
}

4 个答案:

答案 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可能会产生许多不需要的和不可预测的结果,具体取决于包含顺序,应该完全避免。

编辑:至少当我使用g ++编译时,我得到的第一个错误是关于GRAPHMAP :: iterator。当编译器看到可以被视为变量或类型的标识符时,它默认选择将其解释为变量,但稍后发现它实际上是一种类型。您可以使用typename关键字告诉编译器它实际上是一种类型。

要注意的第二件事是map是一个有序容器,因此你需要传入一个比较函数或提供一个&lt;运算符为map的键。由于VERTEX是地图密钥,因此我设置了operator<,以便对对象进行排序并维护订单。您可能需要在VERTEX班级演变时调整比较运算符。

答案 1 :(得分:1)

您无法使用GRAPHVERTEX作为键创建地图,因为您需要能够键与运算符&lt;进行比较。所以你必须定义这个运算符。

答案 2 :(得分:0)

您的VERTEX类用作地图中的键;它需要定义一个“less”运算符。

答案 3 :(得分:0)

要使用类作为地图中的键,您必须为该类型定义operator<,否则您需要在创建地图时指定比较器。假设该类型的对象具有“自然”顺序,您通常希望使用它来实现operator<。当您需要以多个不同的顺序排列给定类型的对象时,通常使用单独的比较器对象,并且没有一个订单实际上比其他订单更“自然”或占优势(例如,与员工合作时,您可能会看起来通过社会安全号码,姓名和资历,他们大致相同。