2

Consider the following code, I've marked the important line with #this symbol:

#include <glad/include/glad/glad.h>
#include <string>
#include <iostream>

#ifndef LAMP_H
#define LAMP_H
namespace lmp{

    class genLamp{
        unsigned int lmpVAO;
        static const float flag{1}; //#this is allowed 
        static const float default_shape[]{  //#this is not allowed
        -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
         0.5f, -0.5f, -0.5f,  1.0f, 0.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
        -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,

        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
        -0.5f,  0.5f,  0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,

        -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
        -0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
        -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,

         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
         0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
         0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
         0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,

        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
         0.5f, -0.5f, -0.5f,  1.0f, 1.0f,
         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,

        -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
        -0.5f,  0.5f,  0.5f,  0.0f, 0.0f,
        -0.5f,  0.5f, -0.5f,  0.0f, 1.0f
    };

        genLamp(std::string vShaderPath, std::string fShaderPath){
            glGenVertexArrays(1, &lmpVAO);
            glBindVertexArray(lmpVAO);


        }

        unsigned int getVAO(){
            return this->lmpVAO;
        }

    };

}

#endif  

First of all, why is this even not allowed, what problem is the language trying to prevent by preventing this? And,

Since the default_shape array is going to be the same across objects no matter what, I was trying to share this array by making it static. But, this doesn't seem to be possible. The only thing I can think of is declaring the variable into a global scope, which is not so good in my case. Does c++ have any syntax to declare and initialize static const arrays ? I'm compiling with c++17 in case the information is useful.

EDIT: if possible please also explain @user's answer

2
  • I would suggest std::array Commented Jun 7, 2020 at 8:11
  • Change const to constexpr. Commented Jun 7, 2020 at 8:39

1 Answer 1

2

Make them inline. The following code compiles.

class Temp {
    inline static const float values[] = { 0.0f, 1.0f };
};

Or even better,

class Temp {
    constexpr static float values[] = { 0.0f, 1.0f };
};

Thanks to John for pointing this out.

Sign up to request clarification or add additional context in comments.

8 Comments

GCC and Clang are also happy if it's constexpr instead.
@user , wow, that actually works, but do you mind please telling me why it didn't work and why it works now
@JohnZwinck , what do you mean? Could you please explain a bit more?
@juztcode, also note that static constexpr variables are implicitly inline.
@juztcode it's in the language specification. Have a read of const static members.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.