extern
следует использовать в заголовочном файле. Помещение extern list *x
в заголовочный файл - это объявление всем исходным файлам, что существует глобальная переменная x
и она объявлена где-то еще. Если вы не придерживаетесь этого подхода и вместо этого пишете extern list *x
в исходном файле (как @ Als's), то вы фактически скрываете объявление и не даете понять всем исходным файлам, что глобальная переменная x
существует. Тогда что может случиться? Может случиться так, что позже вы создадите другой исходный файл file3.cpp
, в котором вы можете ошибочно объявить глобальную переменную с именем x
, что приведет к ошибке компоновщика.
Таким образом, решение состоит в том, чтобы сделать четкое объявление, и правильное место объявления - заголовочный файл - так же, как и все остальные объявления.
Таким образом, ваш код должен выглядеть так:
list.h:
class list { ....};
extern list * x;//extern means the variable declaration is elsewhere
list.cpp:
#include "list.h"
list * x; //alright, the variable declaration is here!
//use x
file1.cpp
#include "list.h"
//use x - no need to write : extern list *x
file2.cpp
#include "list.h"
//use x - no need to write : extern list *x
Что касается ошибки, связанной с queue
, вы должны квалифицировать ее как пространство имен std
, в котором она определена. Напишите это:
std::queue <errorStruct> errQueue;
//^^^^^ mention the namespace
Аналогично, если вы используете string
(для которого вы включили заголовочный файл), тогда напишите std::string
.