Невозможно скомпилировать STL с шаблонами - PullRequest
0 голосов
/ 13 февраля 2011

У меня возникли некоторые проблемы при попытке получить этот шаблон для компиляции, я думаю, что проблема с классом Edge, я успешно скомпилировал его до того, как добавил его.

Во-первых, это должно моделировать взвешенный связный граф,Каждый граф имеет граф, имеет коллекцию всех узлов в системах, и каждый узел является шаблоном, который содержит значение узла типа T (я проверил его с помощью int и char) и список ребер, ребрасоединения с другими узлами, и имеет вес и указатель на другой узел.

Когда у меня был только список узлов (на графике), он компилировался нормально, и все было хорошо.тогда, когда я добавил часть Edges, она просто не компилируется.Может ли быть так, что шаблонам просто не нравится, когда 1 ссылается на тот, который, в свою очередь, указывает назад?

Я получаю следующие ошибки: (Есть несколько других, но я уверен, что это просто ошибка, перенесенная вперед)

C4430: отсутствует указатель типа - предполагается int.Примечание: C ++ не поддерживает default-int edge.cpp 12

ошибка C2974: «std :: list»: неверный аргумент шаблона для «_Ty», введите ожидаемый node.cpp 13

ошибкаC2065: «Край»: необъявленный идентификатор 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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2011

Узел и Край тесно связаны. Edge, вероятно, сначала должен быть «завершен», поскольку Node имеет list<Edge>, поэтому я не уверен, что Edge может быть заранее объявлен в этот момент. У Edge есть Node *, так что это определенно может быть.

template< typename T > class Node;

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

template< typename T> class Node
{
 // define
};
0 голосов
/ 13 февраля 2011

Я думаю, что предварительная декларация Edge исправит это до вашей декларации Node.

template <typename T>
class Edge;

Возможно, вам придется сделать то же самое для Edge с Node.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...