string - 无法在 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.h:
static const std::string MODULE1_NAME = "Module 1 name"; static const std::string MODULE1_KEY1 = "M1_Key1";
模块2.h:
static const std::string MODULE2_NAME = "Module 2 name"; static const std::string MODULE2_KEY1 = "M2_Key1";
在参数解析器的头文件中:
class ParametersParser { static const std::set<std::string> ALLOWED_PARAMS; }
最后,在该参数解析器的源文件中,将来自不同模块的配置迭代器的所有允许值分组:
#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.5(CentOS 7.5 vanilla)和AppleClang 9.1.0.9020039(MacOSX 10.3)中都可以编译,但在 MacOSX 中,结果集只包含一个“.”。就像模块头(,等)中定义的静态字符串MODULE1_NAME
是MODULE1_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{{...}}
,但也没有工作。
非常感谢你的帮助。
解决方案
推荐阅读
- python - 如何在我的 python-2.7 代码中使用 `format` 的地方自动插入 `u`(unicode 指示符)到 `format` 函数调用?
- mysql - 在 MySQL 备份中混淆个人数据
- angular - 为什么我的角度应用程序每次发送发布请求时都会创建套接字连接?
- java - 如何使用 Spring 更新或删除 @CompoundIndex
- sql - 如何使alter命令在MonetDB中生效?
- kivy - 如何从 python 中的文本文件中识别问题?
- amazon-web-services - QuickSight 仪表板未在 iframe 中呈现
- r - 如何使用 `%>%` 更改一列值?
- javascript - 带有 puppeteer 的外部样式表
- c# - 如何通过 C# 在 sharePoint 上创建新的“链接文档”?