mercredi 22 avril 2015

How to create a compile time constant instance of a structure in C++11

In my current project I am trying to create a compile time const static instance of a structure with c++11. My code compiles and works fine in clang (Apple LLVM version 6.1.0) but it does not work with g++ (GCC) 4.8.3. GCC throws the error that the parameter was not declared 'constexpr'. Is there any way to make this work in gcc?

//Parameter.h
struct Par {
    const int uniqid;
    const char *name;
    const char *description;
    constexpr Par(int uid,const char * n,const char * d)
             :uniqid(uid), name(n),description(d){}
};

class Parameters          
{
    const static Par PARAM_A;
    ...
    const static Par PARAM_Z;
    printParameters(std::vector<Par> parameters);
};

//Parameter.cpp
constexpr Par Parameters::PARAM_A={0,"-a","Bla a"};
... 
constexpr Par Parameters::PARAM_Z={0,"-z","Bla z"};

void Parameters::printParameters(std::vector<Par> parameters){

    for (size_t i = 0; i < parameters.size(); i++) {
        switch (parameters[i].uniqid) {
           case PARAM_A.uniqid: 
                std::cout << "A" << std::endl;
                break;
        }
}

The GCC is the following:

Parameters.cpp:11:39: error: declaration of ‘const Par Parameters::PARAM_A’ outside of class is not definition [-fpermissive]
Parameters.cpp:12:39: error: redeclaration ‘Parameters::PARAM_A’ differs in ‘constexpr’
 constexpr Par Parameters::PARAM_A={...};

In file included from Parameters.cpp:2:0:
        Parameters.h:190:34: note: ‘Parameters::PARAM_A’ was not declared 'constexpr' const static Par PARAM_A;

Aucun commentaire:

Enregistrer un commentaire