Визуальная студия 2012 — Weird VS2012 C ++ parse

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: почему?

0

Решение

Часто те круговые #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?

3

Другие решения

Мне кажется, у вас есть цикл включения.

А именно вы включаете 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: О, неважно, я вижу, что это уже ответили.

0

По вопросам рекламы ammmcru@yandex.ru