首页 > 解决方案 > 无法在 CLang 中初始化模板化类中的静态字符串集,在 GCC 中工作正常

问题描述

我正在使用 Boost config_file_iterator以标准 Boost 方式解析不同模块的参数文件:

[Module 1 name]  
M1_Key1=value1
[Module 2 name]
M2_Key1=value2  

为此,Boost 有一个很好的特性来接受包含所有有效键的 std::set,以在传递无效键的情况下抛出异常。

boost::program_options::detail::config_file_iterator cfgIt(configStream, ALLOWED_PARAMS);

在我的代码中,我有一组模块,每个模块都有自己的一组参数,在我拥有的每个模块头中(作为非成员变量):

  1. 模块1.h:

    static const std::string MODULE1_NAME = "Module 1 name";
    static const std::string MODULE1_KEY1 = "M1_Key1";
    
  2. 模块2.h:

    static const std::string MODULE2_NAME = "Module 2 name";
    static const std::string MODULE2_KEY1 = "M2_Key1";
    
  3. 在参数解析器的头文件中:

    class ParametersParser  
    {  
        static const std::set<std::string> ALLOWED_PARAMS;  
    }  
    
  4. 最后,在该参数解析器的源文件中,将来自不同模块的配置迭代器的所有允许值分组:

    #include "module1.h"
    #include "module2.h"
    
    const std::set<std::string> ParametersParser::ALLOWED_PARAMS =
    {{    
        MODULE1_NAME + std::string(".") + MODULE1_KEY1,
        MODULE2_NAME + std::string(".") + MODULE2_KEY1
    }};
    

因为Boost期望作为允许的参数集,一组“Module X Name.MX_KeyY”方式的字符串,并且效果很好。

但是,由于其他原因,我已经模板化了解析文件的类,所以现在我的字符串集也在同一个头文件中声明,如下:

#include "module1.h"
#include "module2.h"

/* Class definition */
template <class T>
class ParametersParser
{
    static const std::set<std::string> ALLOWED_PARAMS;
};

/* Static member initialization */
template <class T>
const std::set<std::string> ParametersParser<T>::ALLOWED_PARAMS =
{{
    MODULE1_NAME + std::string(".") + MODULE1_KEY1,
    MODULE2_NAME + std::string(".") + MODULE2_KEY1
}};

这就是问题出现的地方:这在gcc 4.8.5CentOS 7.5 vanilla)和AppleClang 9.1.0.9020039MacOSX 10.3)中都可以编译,但在 MacOSX 中,结果集只包含一个“.”。就像模块头(,等)中定义的静态字符串MODULE1_NAMEMODULE1_KEY1空的!!!在 gcc/CentOS 中,它工作正常。不幸的是,我无法在 MacOSX 的 gcc 上编译(它抱怨与 Boost 的未解决依赖关系),而 CentOS 上的 CLang(Apple LLVM 版本 9.1.0 (clang-902.0.39.2))也可以正常工作。

你有什么线索我做错了什么吗?是否将字符串用作静态变量?我还尝试使用新的初始化列表语法声明集合const std::set<std::string> ParametersParser<T>::ALLOWED_PARAMS{{...}},但也没有工作。

非常感谢你的帮助。

标签: stringgccstaticinitializationclang

解决方案


推荐阅读