我最近将我的英特尔 C++ 编译器从 v13.0.1(又名 2013)升级到 v14.0.0(又名 2013 sp1)。看起来它使用的标准库已经变得更加符合 C++11。作为其中的一部分,std::locale::facet 已从:
class locale::facet {
protected:
explicit facet (size_t refs = 0);
virtual ~facet();
private:
facet (const facet&); // not defined
void operator= (const facet&); // not defined
}
至:
class locale::facet {
protected:
explicit facet (size_t refs = 0);
virtual ~facet();
facet (const facet&) = delete;
void operator= (const facet&) = delete;
}
关键部分是= delete
用于使其不可复制。(感谢http://www.cplusplus.com/reference/locale/locale/facet/进行并排比较。)
然而, boost/date_time/date_facet.hpp 使用这个:
class date_facet : public std::locale::facet {
这在 boost v1.48.0 和 v1.54.0(我在我的环境中安装的两个)中都没有改变。
date_facet 似乎没有声明任何复制构造函数或operator=
.
在我自己的代码中,我使用它来制作类静态常量来保存时间格式。因此,在头文件中,我将其作为类定义的一部分:
static const boost::local_time::local_time_facet _MYFACET;
在匹配的源文件中我有这个:
const boost::local_time::local_time_facet MyClass::_MYFACET = boost::local_time::local_time_facet("%Y/%m/%d %H:%M:%S.%f");
这段代码已经工作了多年并且没有改变。
现在,当我尝试编译时,出现此错误:
/usr/include/boost/date_time/date_facet.hpp(49): error #373: "std::locale::facet::facet(const std::locale::facet &)" (declared at line 409 of "/usr/include/c++/4.4.6/bits/locale_classes.h") is inaccessible
class date_facet : public std::locale::facet {
^
compilation aborted for MyFile.cpp (code 2)
谷歌搜索没有出现其他人谈论这个问题,这让我觉得我只是在做一些愚蠢的事情。
其他人遇到过这个吗?
有人有解决方案吗?
= delete
我唯一的想法是向 date_facet显式添加声明。如果可行,我会尝试并提供我自己的答案。但我真的不知道。(编辑:这个想法是失败的,所以不要尝试。)