2017-01-02 5 views
0

Я новичок в C++ и пытаюсь изучить OpenGL. Однако, когда я пытаюсь скомпилировать свою программу, я не могу ссылаться на пространство имен, которое я уже создал в своем заголовочном файле. Код выглядит следующим образом:Пространство имен C++ не объявлено

engine.hpp:

#ifndef ENGINE_HPP 
#define ENGINE_HPP 
// ... 
namespace render { 
    void Initialise(); 
    namespace inits { 
    bool glfw_init = false, 
    glfw_window_init = false, 
    gl_init = false; 
    } 
} 
#endif 

engine.cpp:

#include "engine.hpp" 
// ... 
namespace render { 
    void Initialise() { 
    if (glfwInit() == GLFW_FALSE) 
    inits::glfw_init = false; 
    } 
} 

O Я не знаю, почему это не компиляции. Я использую MinGW (GCC) в Windows 10 (64-разрядный).

Мое сообщение Компилятор:

error: 'inits' has not been declared 

Edit: Спасибо всем за ваши предложения. Похоже, что хотя это была неудача компилятора (после моего первого редактирования, поскольку другие не смогли воспроизвести проблему и переустановить исправленную проблему), это является симптомом более сложной организационной проблемы в моем коде. Поскольку я только инвестировал ~ 15 минут в программу, я бы предпочел полностью переписать это, узнав больше о языке. На данный момент я создал класс и решил обсуждаемый вопрос. Я новичок, и любые рекомендации по книге/ресурсам будут приветствоваться!

+5

Знаете ли вы, что ваш код сделает какой-либо блок компиляции (исходный файл), который '#include" engine.hpp "испускает другой' render :: inits :: glfw_init' (и, следовательно, вызывает ошибки при компоновке/загрузке)? Все это пахнет как очень бедный (попытка) C++. В C++ данные/методы, такие как 'init' или' Initialise() ', как правило, не нужны и заменяются конструкторами. – Walter

+4

Не удалось воспроизвести: http://coliru.stacked-crooked.com/a/37fd43340f5a8ba5 Создайте [mcve]. – user2079303

+0

Принимая во внимание, ваши изменения: невозможно воспроизвести. Вы компилируете свой код с помощью G ++? –

ответ

0

Ваш код не то, что вы думаете, что он делает.

// file engine.hpp 
namespace render { 
    void Initialise(); 
    namespace inits { 
    bool glfw_init = false,  // these variables will be emitted with 
    glfw_window_init = false, // every source file that 
    gl_init = false;   // #include "engine.hpp" 
    } 
} 

приведет к ошибкам ("mulitply defined symbols") при компоновке/загрузке. Чтобы избежать этого, вы можете объявить переменные extern или использовать функции для установки/получения состояния (хранятся в переменной, определенной в engine.cpp).

+0

Я переместил весь метод Initialise в конструктор, и почему-то я избежал проблемы. Пример должен компилироваться, поэтому я переместил его в другой проект, и проблема сохранилась. Я переустановил MinGW, и проблема была исправлена. –

+2

Вместо глобальных переменных и функции построения рассмотрим создание класса. –

1

Вы используете вложенные пространства имен, так должно быть:

render::inits::glfw_init = false;

+0

Извините, я забыл упомянуть, что Initialise() находится в пространстве имен рендеринга. –

Смежные вопросы