2011-02-27 79 views
1

我已经编写了一些类来实现树ADT,它存储了两组边和一个节点。它存储的是SSet类,它们是使用set库的接口。在C++中预期的嵌套名称说明符错误

这些班的轮廓以及SSet.H都是由工作人员给我们的,我写了功能。

行号103(函数GenGraphTemp::RemoveEdge)编译器(克++)告诉:

expected nested-name-specifier before NodeEdge 
expected ',' or '...' before '&' token 
ISO C++ forbids declaration of 'NodeEdge' with no type 

也用于以下RemoveEdge它说的功能:

expected ';' before "const"为线106

expected ';' before "SSet"expected ';' before "const"为line 120

expected ';' before "friend"对于行134

#include "sset.H" 

using namespace std; 

#define EQ(a1,a2) (!(a1 < a2) && !(a2 < a1)) 
#define MAX(a1,a2) ((a2<a1)?a1:a2) 
#define MIN(a1,a2) ((a1<a2)?a1:a2) 

template <class Node> 
class Edge { 
public: 
    ... 

protected: 
    Node _start; 
    Node _end; 
}; 


template <class Node> 
class GenGraphTemp { 
public: 

    // Adds a new node to the nodes set 
    bool AddNode (const Node& n1){return _nodes.Add(n1);} 

    // Removes a node from the nodes set and all edges connected to it 
    bool RemoveNode (const Node& n1) { 
     int edges_size = _edges.Size(); 
     int i; 
     Edge const *epointer; 
     //remove edges connected to n1 
     for (i=0;i<edges_size;i++){ 
      (((i==0)? *epointer=_edges.GetFirst(): *epointer=_edges.GetNext())); 
      if (EQ(epointer->GetStart(),n1)||EQ(epointer->GetEnd(),n1)){ 
       (_edges.Remove(*epointer)==false) && (return false); 
      } 
     } 
     // remove node 
     return _nodes.Remove(n1); 
    } 

    // Add a new edge to the edges set 
    bool AddEdge (const Node& n1, const Node& n2) { 

     (EQ(n1,n2)) && (return false); 

     if ((_nodes.IsIn(n1)) && (_nodes.IsIn(n2))){ 
      typename NodeEdge edge(n1,n2); 
      return _edges.Add(edge); 
     } 
     return false; 
    } 

    // Removes an edge from edges set 
    bool RemoveEdge (const typename NodeEdge& e1) {return _edges.Remove(e1);} 

    // Check if two nodes are connected 
    bool RConnected const (const Node& n1, const Node& n2) { 
     Edge const *epointer; 
     int edges_size = _edges.Size(); 
     int i; 
     for (i=0; i<edges_size; i++){ 
      ((i==0)? *epointer=_edges.GetFirst(): *epointer=_edges.GetNext()); 
      if (EQ(epointer->GetStart(),MIN(n1,n2)) && EQ(epointer->GetEnd(),MAX(n1,n2))){ 
       return true; 
      } 
     } 
    } 

    // Return a set of all the nodes that are connected to the input node through an edge 
    // if the node does not have ant neighbours, the function will return an empty set 
    SSet<Node>* Neighbours const (const Node& n1) { 
     Edge const *epointer; 
     int i, edge_size; 
     SSet<Node>* neighbours = new SSet<Node>; 
     edge_size=_edges.Size(); 
     for (i=0; i<edges_size; i++){ 
      ((i==0)? *epointer=_edges.GetFirst(): *epointer=_edges.GetNext()); 
      if (EQ(epointer->GetStart(),n1)||EQ(epointer->GetEnd(),n1)){ 
       (neighbours->IsIn(*epointer)) || (neighbours->Add(*epointer); 
      } 
     } 
     return neighbours; 
    } 

    friend ostream& operator<<(ostream& os, GenGraphTemp<Node>& gr) 
    { 
     os << "Nodes:\n" << gr._nodes << "Edges:\n" << gr._edges; 
     return os; 
    } 


protected: 
    typedef Edge<Node> NodeEdge; 
    SSet<Node> _nodes; 
    SSet<NodeEdge> _edges; 
}; 

我不明白在哪里,什么是问题。

编辑:

我已经删除的功能和运营商实现了Edge类以减少线路。 我没有删除GenGraphTemp类的实现,因为我不知道这个问题是否与其中一个或其他地方有关。

我也试着在备注中编译每个“好”功能的代码,但它没有帮助。

+1

太多看... – Anycorn 2011-02-27 17:30:09

回答

3
// Removes an edge from edges set 
bool RemoveEdge (const typename NodeEdge& e1) {return _edges.Remove(e1);} 

// Check if two nodes are connected 
bool RConnected const (const Node& n1, const Node& n2) { 

使

// Removes an edge from edges set 
bool RemoveEdge (const NodeEdge& e1) {return _edges.Remove(e1);} 

// Check if two nodes are connected 
bool RConnected (const Node& n1, const Node& n2) const { 

等....

+0

它没有 “前NodeEdge预计嵌套名称符” 错误删除,但所有其他错误仍然存​​在。 – SIMEL 2011-02-27 17:40:20

+0

@Ilya现在照顾consts。 – Anycorn 2011-02-27 17:58:47

+0

@Ilya:你有没有注意到在RConnected定义中关键字'const'是如何移动的?要使成员函数为'const',你需要在参数列表后加上'const'关键字。 – 2011-02-27 18:00:49

相关问题