connector.hpp
#ifndef __CONNECTOR_HPP_
#define __CONNECTOR_HPP_
#include <a/b/c/connection.hpp>
namespace a {
namespace b {
namespace c {
class connector {
public:
explicit connector(const int port);
void run();
void stop();
};
}
}
}
#endif
connection.hpp
#ifndef __CONNECTION_HPP_
#define __CONNECTION_HPP_
#include <a/b/c/connector.hpp>
namespace a {
namespace b {
namespace c {
class connection {
private:
connector owner_; //line 42
};
}
}
}
#endif
Эти простые классы имеют несколько тривиальных (пустых) реализаций в файлах cpp.
VS2012 говорит это, когда я пытаюсь скомпилировать это:
Ошибка 1, ошибка C2146: синтаксическая ошибка: отсутствует ‘;’ перед идентификатором ‘owner_’ c: \ a \ b \ c \ connection.hpp 42 1 тест
Ошибка 2 ошибка C4430: отсутствует указатель типа — предполагается int. Примечание: C ++ не поддерживает default-int c: \ a \ b \ c \ connection.hpp 42 1 тест
Дело в том, что редактор VS не видит проблем — никаких красных подчеркиваний и т. Д.
Включить пути установлены правильно, я добавил $(SolutionDir)\..\
включает в себя, чтобы я мог использовать полные пути, такие как a/b/c
вместо относительных.
Тем не менее, это не компилируется .. но это было один раз.
Q: почему?
Часто те круговые #include
директивы смертельны. Это, конечно, то, что здесь происходит. Предположим, вы #include "connector.hpp"
в каком-то другом файле. То, что произойдет, это то, что Connector.hpp будет #include "connection.hpp"
, Этот файл будет в свою очередь #include "connector.hpp"
, но теперь это не работает, потому что защита подключения для connector.hpp уже активна. То, что вы в конечном итоге class connection
определяется раньше class connector
, Это проблема, потому что член данных в class connection
это пример class connector
,
Почему файл connector.hpp включает в себя connection.hpp?
Мне кажется, у вас есть цикл включения.
А именно вы включаете connection.hpp
в connector.hpp
а также connector.hpp
в connection.hpp
Опустить #include <a/b/c/connection.hpp>
в соединитель.hpp
Я думаю, что проблема может быть в том, что компилятор начинает компилировать connector.hpp
тогда препроцессор видит #include <a/b/c/connection.hpp>
заменяет #include
с содержимым файла .hpp (грубо говоря) Когда он пытается включить соединитель.hpp, он проверяет охранники и видит, что __CONNECTOR_HPP_
определяется и пропускает его, так как class connector
еще не объявлено, что выдает эту ошибку.
PS: О, неважно, я вижу, что это уже ответили.