2

请帮忙:

g++ (GCC) 3.4.4

我有两个“.hpp”文件:“UnionFind.hpp”和“Graph.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”的问题,但是将“using std::set”添加到“Graph.hpp”并不能解决问题。另外,我尝试过“使用 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 回答