2016-07-08 8 views
0

私は現在、OpenGLを使用していくつかのコードを実装しています。さまざまなOpenGLクラスのラッパーを作成しました。特に、頂点配列バッファまたは要素配列バッファを表すバッファクラスがあります。これを行うには、私はそうのようなヘッダーで私のクラスを宣言:私のレンダラクラスでC++別のクラスの列挙を正しく使用する

Buffer.h 

namespace FE { namespace GL { 
    enum BufferType { 
     ARRAY = GL_ARRAY_BUFFER, 
     ELEMENT = GL_ELEMENT_ARRAY_BUFFER 
    }; 

    class Buffer { 
    public: 
     Buffer(BufferType type); 
     ... rest of class ... 
    }; 
} 

、私はクラスのメンバとして、いくつかのバッファをインスタンス化しよう:何らかの理由で

Renderer.h 

... 
#include "../GL/Buffer.h" 

namespace FE { namespace Render { 
    class Renderer { 
    ... 
    private: 
     GL::Buffer vbo(GL::BufferType::ARRAY); 
     GL::Buffer element(GL::BufferType::ELEMENT); 
    };  
}} 

、使用しようとしますこのようにenumを指定すると、「構文エラー:識別子 'ELEMENT'」というエラーが表示されます。 Intellisenseは、 "定数:FE :: GL :: ELEMENT 'は型名ではないことを警告しています。

これはなぜ私のバッファ関連のコードをテストしている間、私は(スコープ演算子で列挙型の値にアクセスして)同様の方法でバッファを作成したように動作しないのか分かりません。

この問題を解決する方法については、ご了承ください。

+0

'vbo'と' element'データメンバを初期化しようとしていますか、 'vbo'と' element'メンバ関数を作成しようとしていますか? –

+0

メンバー関数ではなくデータメンバーを作成しようとしています。 –

+1

ああ、あなたが何を得ているのか分かります。 'GL ::バッファvbo = GL ::バッファ(GL :: ARRAY);' ありがとうございました! –

答えて

3

enumはC++でスコープを作成しません。列挙型のタイプはFE::GL::BufferTypeですが、あなたは(C++ 11を使用して)スコープの列挙型を使用して、メンバーを初期化するデフォルトにしたい場合は、必要にenum class

+1

C++ 11以降では、 'GL :: BufferType :: ARRAY'は完全に有効です。この質問はC++ 14でタグ付けされているので、これは問題ではありません。 – Holt

+0

その場合、私はそれについて聞いたことがありません。列挙型の範囲に関するC++ 11以降の変更点は?既に述べたように、スコープ付き列挙型の列挙型クラスを提供しましたが、普通の列挙型列挙型では何も変更されていません。 – Chris

+0

[元の提案](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf)(セクション3.2)、[対応するセクション](http: /www.stroustrup.com/C++11FAQ.html#enum)BjarneのC++ 11 FAQと標準のセクション7.2/11(特に 'direction'の例)にあります。私は現在の標準でこれについて良い見積もりを見つけるのは難しいと認めなければなりません。 – Holt

1

を使用したい場合は、それを使用するために、あなただけのGL::Buffer vbo(GL::ARRAY);

を入力します使用のいずれかブレース{}又は=:これらの制限は、メンバ関数宣言とデフォルトmembe間amibiguityを避けるために含まれていた

Non-static data members may be initialized in one of two ways:

2) Through a default member initializer, which is simply a brace or equals initializer included in the member declaration, [...]

namespace FE { namespace Render { 
    class Renderer { 
    private: 
     GL::Buffer vbo{GL::BufferType::ARRAY}; 
     GL::Buffer element{GL::BufferType::ELEMENT}; 
    };  
}} 

r初期化プログラムについては、提案書:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2756.htm(特に、の問題1のセクション)を参照してください。

+0

これは問題だった、ありがとう! –

関連する問題