Включение graph.h вызывает ошибку компиляции в g ++ - PullRequest
0 голосов
/ 27 июня 2019

Я пытался реализовать класс для манипулирования графами. Поэтому я создал два файла graph.cc и graph.h. После завершения определений в заголовочном файле и реализации в файле c ++ я включил graph.h, используя директиву препроцессора #include "graph.h". И я получил это сообщение об ошибке компиляции после выполнения команды g++ -I. -c graph.cc:

graph.cc: In constructor ‘Graph::Graph(int)’:
graph.cc:4: error: ‘class Graph’ has no member named ‘adj’
graph.cc:4: error: expected type-specifier before ‘Neighbors’
graph.cc:4: error: expected ‘;’ before ‘Neighbors’
graph.cc:6: error: ‘adj’ was not declared in this scope
graph.cc:6: error: expected type-specifier before ‘Neighbors’
graph.cc:6: error: expected ‘;’ before ‘Neighbors’

Я создал два файла test.cc и test.h, идентичных предыдущим, с помощью команды include, измененной на #include "test.h". Команда для новых файлов была g++ -I. -c test.cc, и она успешно скомпилирована без ошибок.

Я думал, что предыдущий файл каким-то образом содержит неправильный файл graph.h из другого источника, поэтому я использовал эти команды для остановки после фазы предварительной обработки и увидел разницу между двумя версиями:

g++ -I. -E test.cc > out2.txt

g++ -I. -E graph.cc > out.txt

diff out.txt out2.txt

Это вывод dif:

1c1
< # 1 "graph.cc"
---
> # 1 "test.cc"
4,5c4,5
< # 1 "graph.cc"
< # 1 "graph.h" 1
---
> # 1 "test.cc"
> # 1 "test.h" 1
23c23
< # 2 "graph.cc" 2
---
> # 2 "test.cc" 2

Так что, похоже, единственная разница - это имена файлов, а все остальное содержимое идентично (я также проверил текст, и он содержал все определения).

sudo find / -iname "graph.h"

Это последнее, что я попробовал, и я не нашел ничего, кроме файла, который я создал.

Изменение #include "graph.h" на #include "test.h" в файле graph.cc устраняет проблему, но я хотел бы знать, в чем проблема с присвоением имени файлу graph.h? Вероятно, это как-то связано со старым компилятором g ++, потому что я пытался воспроизвести ошибку на моей машине, но она отлично работала.

Версия g ++, выдавшая ошибку: g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3

Это исходные коды.

graph.h

#ifndef _H_GRAPH
#define _H_GRAPH
template<class T>
class List{
public:
  List(){}
  List(int*){}
};
class Graph{
  typedef List<int> Neighbors;
  typedef Neighbors** AdjacencyList;

  private:
    AdjacencyList adj;
  public:
    Graph(int n);
};

#endif

graph.cc

#include "graph.h"

Graph::Graph(int n){
  this -> adj = new Neighbors*[n];
  for(int i = 0;i < n;i++)
    adj[i] = new Neighbors((int*) 0);
}

test.h - это то же самое, что и graph.h. И единственная разница между test.cc и graph.cc - это включенный файл.

...