代码之家  ›  专栏  ›  技术社区  ›  Avinash

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

  •  2
  • Avinash  · 技术社区  · 14 年前

    头文件为“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 回复  |  直到 14 年前
        1
  •  3
  •   Mark B    14 年前

    有两个问题。

    首先,您必须限定依赖类型 insert :

    void insert(GRAPHVERTEX inSRC, GRAPHVERTEX inDST)
    {
        typename GRAPHMAP::iterator itr = m_graph.find(inSRC);
    }
    

    其次,顶点类需要一个<运算符。在Vertex的公共部分添加:

    bool operator<(const VERTEX<T>& right) const { return m_vertex < right.m_vertex; }
    

    作为样式问题,在C++中所有的大写名称通常都保留为常量。 Vertex 对你的班级来说是一个更正常的名字。还要注意 using namespace 在报头中,根据包含顺序,可能会有许多不需要的和不可预测的结果,应该完全避免。

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

    第二点要注意的是 map 是有序容器,因此需要传递比较函数或为 地图 . 自从 VERTEX 是地图键,我设置了一个 operator< 以便对对象进行排序并保持顺序。您可能需要将比较运算符调整为 顶点 课程发展。

        2
  •  1
  •   Yakov Galka    14 年前

    不能用graphvertex作为键创建地图,因为您需要 比较 带操作员的钥匙<。所以必须定义这个操作符。

        3
  •  0
  •   Alex Emelianov    14 年前

    顶点类用作映射中的键;需要定义一个“更少”的运算符。

        4
  •  0
  •   Jerry Coffin    14 年前

    要使用类作为映射中的键,必须定义 operator< 对于该类型,或者在创建映射时需要指定比较器。假设该类型的对象具有“自然”顺序,则通常希望使用该顺序来实现 操作员< . 当需要将给定类型的对象按不同的顺序排列时,通常使用单独的Comparator对象,并且没有任何一个顺序比其他顺序更“自然”或更占主导地位(例如,在与员工合作时,您可能会以同样的频率通过社会保障编号、姓名和资历)。