2011-02-13 8 views
0

이 템플릿을 컴파일하는 데 문제가 있습니다. 문제가 Edge 클래스에 있다고 생각합니다. 추가하기 전에 기꺼이 컴파일했습니다.템플릿으로 STL을 컴파일 할 수 없습니다.

먼저 가중 연결된 그래프를 모델링한다고 가정합니다. 각 그래프는 시스템의 모든 노드를 모아 놓은 그래프를 가지고 있으며, 각 노드는 T 타입의 노드 값 (int와 char로 테스트했습니다)과 가장자리 목록을 보유하고있는 템플릿입니다 다른 노드들에 대한 연결을 가지며, 다른 노드에 대한 가중치 및 포인터를 갖는다.

노드 목록 만 있으면 (그래프에서) 컴파일이 잘되었고 모두 잘되었습니다. then Edges 파트를 추가하면 컴파일되지 않습니다. 템플릿은 1이 1을 가리킬 때 그것을 좋아하지 않을 수 있습니까?

나는 다음과 같은 오류를 얻을 : (거기에 몇 가지 다른 사람들이 있지만 나는 그들이 단지 이월 된 오차 확신)

C4430를 : 누락 된 형식 지정자 - 은 가정 int로. 참고 : C++가 기본-INT edge.cpp 12

오류 C2974를 지원하지 않습니다 : '표준 : : 목록을': '_Ty'를 입력 예상 node.cpp 13

오류 C2065에 대한 잘못된 템플릿 인수 : 'Edge': 신고하지 않음 식별자 node.cpp 13

도움이 될만한 정보가 있으면 알려 주시기 바랍니다.

#ifndef GRAPH_CPP 
#define GRAPH_CPP 

#include "Node.cpp" 
#include <list> 

using namespace std; 

template <typename T> 
class Graph 
{ 
private: 
    list< Node<T>* > nodes; 
    //bool (*compare) (T, T); 
public: 
    Graph(){} 
    void addNodes(T nNode) 
    { 
     nodes.push_back(new Node<T>(nNode)); 
    } 
}; 
#endif 


#ifndef NODE_CPP 
#define NODE_CPP 

#include <vector> 
#include "Edge.cpp" 

using namespace std; 

template <typename T> 
class Node 
{ 
private: 
    list< Edge <T> > adjacencies; 
    T value; 
public: 
    Node(T nVal) 
    { 
     value = nVal; 
    } 
    T getValue() 
    { 
     return value; 
    } 
}; 
#endif //NODE_CPP 


#ifndef EDGE_CPP 
#define EDGE_CPP 

#include "Node.cpp" 

template <typename T> 
class Edge 
{ 
private: 
    Node<T>* node; 
public: 
    Edge(){} 
}; 

#endif 
+3

.cpp 파일을 포함 하시겠습니까? – fredoverflow

+0

어떻게 모든 것을 인스턴스화합니까? –

+0

당신은 cpp 파일을 포함해서는 안됩니다 ... 대신 헤더 파일을 포함시켜야합니다 ... – smerlin

답변

0

Edge의 전달 선언은 노드 선언 전에 해결할 것이라고 생각합니다.

template <typename T> 
class Edge; 

노드가있는 Edge에서도 동일한 작업을 수행해야 할 수 있습니다.

+0

예. 아마도 Edge 파일에서 같은 작업을 수행해야 할 것입니다. – GWW

+0

안녕하세요, 해답을 주셔서 감사합니다. 시도해 보겠습니다. 노드 파일에 기록됩니다.C에서 함수를 지정하는 것과 같은가? – 111111

+0

예. 그러나 많은 의견들이 제안한 바를 수행하고 파일 이름을 .h (헤더) 파일로 변경해야합니다. 또한 네임 스페이스 표준을 사용하여 제안한 것을 사용하고 사용하지 않아야합니다. – GWW

0

노드와 가장자리가 단단히 결합되어 있습니다. 노드가 list<Edge> 인 것처럼 Edge가 "완료"되어야하므로 Edge가 전달 될 수 있는지 확실하지 않습니다. Edge에는 Node *가 있으므로 확실히 될 수 있습니다.

template< typename T > class Node; 

template< typename T > class Edge 
{ 
// define 
}; 

template< typename T> class Node 
{ 
// define 
}; 
관련 문제