Ошибка компиляции с C ++ и пространством имен - PullRequest
3 голосов
/ 04 апреля 2011

Вот полный код получения ошибок:

Engine.h

#ifndef ENGINE_H
#define ENGINE_H

#include "DXManager.h"

namespace XEngine
{
    class Engine
    {
    };
}

#endif

DXManager.h

#ifndef DX_MANAGER_H
#define DX_MANAGER_H



namespace XEngine
{
    class Engine; // forward declaration

    class DXManager
    {
    public:
        void run(Engine *engine);
    };
}

#endif

DXManager.cpp

#include <iostream>

#include "Engine.h"
#include "DXManager.h"

using namespace XEngine;

void DXManager::run(Engine *engine)
{
    std::cout<<"DXManager::run"<<std::endl;
}

С этими 30 строками кода я получаю 20 ошибок вроде:

'XEngine' : a namespace with this name does not exist
'XEngine' : a symbol with this name already exists and therefore this name cannot be used as a namespace name
syntax error : identifier 'Engine'

Очевидно, япропустить что-то важное здесь.Что я делаю не так?

примечание: я знаю, что круговая зависимость - это плохо, но в моем конкретном случае я считаю, что она актуальна.

Ответы [ 3 ]

3 голосов
/ 04 апреля 2011

В DXManager.cpp вы не просто используете некоторые имена из пространства имен XEngine. Вы определяете функцию в этом пространстве имен.

Так должно быть:

DXManager.cpp

#include <iostream>

#include "Engine.h"
#include "DXManager.h"

namespace XEngine {

void DXManager::run(Engine *engine)
{
    std::cout<<"DXManager::run"<<std::endl;
}

}

AFAIK Некоторые из компиляторов (например, MSVC) тоже обрабатывают using вариант. Но это не правильно, потому что ваш синтаксис пытается определить функцию ::DXManager::run, а не ::XEngine::DXManager::run, которую вы намереваетесь определить.

2 голосов
/ 04 апреля 2011

В прямом объявлении класса Engine пространство имен XEngine на данный момент не существует.

Обходным решением будет перемещение объявления внутри блока пространства имен.

1 голос
/ 04 апреля 2011

Когда Engine.h включает в себя DXManager.h, последний определяет класс XEngine :: Engine без предварительного объявления пространства имен.

...