【问题标题】:How to create a compile time constant instance of a structure in C++11如何在 C++11 中创建结构的编译时常量实例
【发布时间】:2015-04-22 14:52:49
【问题描述】:

在我当前的项目中,我正在尝试使用 c++11 创建结构的编译时 const 静态实例。我的代码在 clang(Apple LLVM 版本 6.1.0)中编译并运行良好,但它不适用于 g++(GCC)4.8.3。 GCC 抛出参数未声明为“constexpr”的错误。 有什么办法可以在 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;
        }
}

GCC 如下:

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;

【问题讨论】:

  • 请复制exact错误信息。此外,请先修复您的语法错误。
  • @user2079303 我添加了错误并删除了一些拼写错误。现在是否足以理解问题?
  • FWIW,GCC 4.9 接受这个。

标签: c++ c++11 gcc clang


【解决方案1】:

我认为问题在于您在 Parameter.h 中将 PARAM_APARAM_Z 声明为 const,然后在 Parameter.cpp 中将它们定义为 constexprconstconstexpr 是不同的东西。在 Parameter.cpp 你必须有这样的东西:

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

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多