2

助けてください:

g ++(GCC)3.4.4

'UnionFind.hpp'と"Graph.hpp"の2つの'.hpp'ファイルがあります。ファイルの内容は次のとおりです。

#ifndef UNIONFIND_HPP
#define UNIONFIND_HPP

#include <vector>

using std::vector;

class UnionFind
{
   public:
      UnionFind(uint32_t size);
      ~UnionFind();
      int find(uint32_t target);
      void join(uint32_t a, uint32_t b);
      void print();
   private:
      uint32_t size;
      uint32_t* index;
      vector<uint32_t>** sets;
};

#endif

そして他:

#ifndef GRAPH_HPP
#define GRAPH_HPP

#include <set>

using std::set;

class Graph
{
   public:
      Graph(uint32_t width, uint32_t length, uint32_t startN, uint32_t startP, uint32_t endN, uint32_t endP);
      ~Graph();
      int cost(uint32_t a, uint32_t b);
      void set(uint32_t a, uint32_t b, uint32_t cost);
      void print();
      bool inPath(uint32_t node);
   private:
      int32_t** adjList;
      uint32_t startN;
      uint32_t startP;
      uint32_t endN;
      uint32_t endP;
      set<uint32_t>* path;
      const uint32_t width;
      const uint32_t length;
      const uint32_t size;
      const uint32_t listWidth;
};

#endif

何らかの理由で、次のエラーが発生します。

./Graph.hpp:23: error: ISO C++ forbids declaration of `set' with no type
./Graph.hpp:23: error: expected `;' before '<' token

以前、「UnionFind.hpp」に「using std :: vector」を含めないという問題が発生しましたが、「Graph.hpp」に「usingstd::set」を追加しても問題は解決しません。また、'std :: set <uint32_t>'を使用してみましたが、次のエラーが発生します。

./Graph.hpp:6: error: a template-id may not appear in a using-declaration
./Graph.hpp:23: error: ISO C++ forbids declaration of `set' with no type
./Graph.hpp:23: error: expected `;' before '<' token
4

2 に答える 2

7

変化する

set<uint32_t>* path;

std::set<uint32_t>* path;

コンパイラset()は、クラスで宣言したメソッドを意味するようにsetを理解します。

using ...;ヘッダーファイルをインクルードするすべての人に強制するため、ヘッダーファイルを挿入するのは悪いスタイルです。ヘッダーファイルでは常に明示的な名前空間を使用してください。using ...;ソースファイル用に保存します。

于 2012-11-16T22:59:51.933 に答える
0

言われているようusingに、ほとんどの場合(少なくともグローバル名前空間では)ヘッダーで使用するのは悪いスタイルです。

または、明確にします。

  ::set<uint32_t>* path;
于 2012-11-16T23:05:16.820 に答える