93094


### 質問内容

以下のソースファイルでエラーが発生するのですがこのエラーコードの意味がわかりません。  
`expected initializer before ‘Render’`日本語訳
`「Render」の前に必要な初期化子`とは何をすればいいのでしょうか？

### 知りたいこと

Renderの前に必要な初期化子とは何か知りたい

### 参考サイト

<https://stackoverflow.com/questions/41968329/c-error-expected-initializer-
before-variablename>  
<https://qiita.com/hmito/items/9d928322ca978319da59>

### エラーコード

[code]

    src/Render.hpp: At global scope:
    src/Render.hpp:73:36: error: expected initializer before ‘Render’
       73 | T Render<T>::SpriteVertexAttribute Render<T>::spriteVertex[4] = Rendr::SpriteVertexAttribute{ {0,0,0},{0,0}};    //スプライト頂点属性
          |                                    ^~~~~~
    make: *** [Makefile:25: obj/Render.o] エラー 1
    
    
        FrameWork Compile Error
    
[/code]

### エラーコード (一番左側のTを消した時のエラー)

[code]

    rc/Render.hpp: At global scope:
    src/Render.hpp:72:1: error: need ‘typename’ before ‘FrameWork::Render<T>::SpriteVertexAttribute’ because ‘FrameWork::Render<T>’ is a dependent scope
       72 | Render<T>::SpriteVertexAttribute Render<T>::spriteVertex[4] = Render::SpriteVertexAttribute{ {0,0,0},{0,0}};    //スプライト頂点属性
          | ^~~~~~~~~
          | typename 
    make: *** [Makefile:23: obj/Render.o] エラー 1
    
    
[/code]

### ヘッダー部

[code]

    #ifndef ___RENDER_HPP___
    #define ___RENDER_HPP___
    
    #include "Component.hpp"
    
    #include "glm/gtc/matrix_transform.hpp"
    #include "glm/glm.hpp"
    
    
    #include <glew/glew.h>
    #include <GL/gl.h>
    
    #include <memory>
    
    namespace FrameWork
    {
        class GameObject;
        class Material;
    
        template<typename T>
        class Render : public Component<T>
        {
        public:
    
            static void Init();
    
            Render()
            {
            
                glGenVertexArrays(1, &vao);
                
                glGenBuffers(1, &vbo);
    
                glBindVertexArray(vao);
                glBindBuffer(GL_ARRAY_BUFFER, vbo);
    
                glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(SpriteVertexAttribute), spriteVertex, GL_DYNAMIC_DRAW);
    
                glBindVertexArray(0);
                glBindBuffer(GL_ARRAY_BUFFER, 0);
            
            }
    
            ~Render();
    
            static void SetSpriteAttribute(glm::ivec2 s);
    
    
            virtual void RenderBuffer(const glm::mat4 view) = 0;
    
            std::shared_ptr<Material> material;        
    
    
            struct SpriteVertexAttribute
            {
                float position[3];
                float uv[2];
            };
    
            static SpriteVertexAttribute spriteVertex[4];
    
        protected:
        
            GLuint vao;
            GLuint vbo;
    
            
        private:    
        };
    
    
    template<typename T>
    T Render<T>::SpriteVertexAttribute Render<T>::spriteVertex[4];
    
    //template<typename T>
    //Render<T>::SpriteVertexAttribute Render<T>::spriteVertex[4];
    }
    #endif
    
[/code]

### ソース部

[code]

    #include "Render.hpp"
    #include "Material.hpp"
    #include "Window.hpp"
    #include <iostream>
    
    /*####################################
    # 初期化
    ######################################*/
    template<typename T>
    void FrameWork::Render<T>::Init()
    {
        //UV座標
        spriteVertex[0].uv[0] = 0;
        spriteVertex[0].uv[1] = 0;
    
        spriteVertex[1].uv[0] = 0;
        spriteVertex[1].uv[1] = 1;
    
        spriteVertex[2].uv[0] = 1;
        spriteVertex[2].uv[1] = 0;
    
        spriteVertex[3].uv[0] = 1;
        spriteVertex[3].uv[1] = 1;
    
    
        // 頂点座標
        spriteVertex[0].position[0] = -0.5f;
        spriteVertex[0].position[1] = 0.5f;
        spriteVertex[0].position[2] = 0;
    
        spriteVertex[1].position[0] = -0.5f;
        spriteVertex[1].position[1] = -0.5f;
        spriteVertex[1].position[2] = 0;
    
        spriteVertex[2].position[0] = 0.5f;
        spriteVertex[2].position[1] = 0.5f;
        spriteVertex[2].position[2] = 0;
    
        spriteVertex[3].position[0] = 0.5f;
        spriteVertex[3].position[1] = -0.5f;
        spriteVertex[3].position[2] = 0;
    
    }
    
    
    /*####################################
    # スプライトの頂点属性をリセット 
    ######################################*/
    template<typename T>
    void FrameWork::Render<T>::SetSpriteAttribute(glm::ivec2 s)
    {
        if( (s.x <= 0) || (s.y <= 0) )
        {
            std::cout<<"Material Error: サイズが不正です。"<< std::endl;        
        }
    
        //UV座標
        spriteVertex[0].uv[0] = 0;
        spriteVertex[0].uv[1] = 0;
    
        spriteVertex[1].uv[0] = 0;
        spriteVertex[1].uv[1] = 1;
    
        spriteVertex[2].uv[0] = 1;
        spriteVertex[2].uv[1] = 0;
    
        spriteVertex[3].uv[0] = 1;
        spriteVertex[3].uv[1] = 1;
    
    
        glm::vec2 size;
        size.x = (1.0f / Window::context->getSize().x) * s.x;
        size.y = (1.0f / Window::context->getSize().y) * s.y;
    
        // 頂点座標
        spriteVertex[0].position[0] = -size.x;
        spriteVertex[0].position[1] = size.y;
        spriteVertex[0].position[2] = 0;
    
        spriteVertex[1].position[0] = -size.x;
        spriteVertex[1].position[1] = -size.y;
        spriteVertex[1].position[2] = 0;
    
        spriteVertex[2].position[0] = size.x;
        spriteVertex[2].position[1] = size.y;
        spriteVertex[2].position[2] = 0;
    
        spriteVertex[3].position[0] = size.x;
        spriteVertex[3].position[1] = -size.y;
        spriteVertex[3].position[2] = 0;
    
    }
    
    
    
    
    /*####################################
    # デストラクタ
    ######################################*/
    template<typename T>
    FrameWork::Render<T>::~Render()
    {
    
    }
    
[/code]


CC BY-SA 4.0
2022-12-29T10:35:16.327
93089
2022-12-30T03:31:52.193
2022-12-30T03:31:52.193
55177
55177
question
c++
コンパイルエラー　[expected initializer before ‘Render’] の意味が知りたい


やりたいことはクラス変数の初期化でしょうから、行頭の`T`は誤記（不要）ですね。

[code]

    template<typename T>
    T Render<T>::SpriteVertexAttribute Render<T>::spriteVertex[4] = Render::SpriteVertexAttribute{ {0,0,0},{0,0}};    //スプライト頂点属性
    
[/code]

コンパイラーは、以下のように変数名の後ろは初期化子を期待しているのに、その位置に初期化子ではない`Render<T>::spriteVertex[4]`が書かれているので、"expected
initializer before ‘Render’"だと言っているのでしょう。

[code]

    型 変数名 = 初期化子;
    
[/code]


CC BY-SA 4.0
2022-12-29T13:14:27.653
93094
2022-12-29T13:14:27.653
7291
93089
answer