mir*_*o_x 2 c++ compiler-errors sstream
使用gcc5.4.0在大型项目上运行make时,我遇到了此错误。
/usr/include/c++/5/sstream:300:14: error: '__xfer_bufptrs' redeclared with 'public' access
struct __xfer_bufptrs
^
/usr/include/c++/5/sstream:67:14: note: previously declared 'private' here
struct __xfer_bufptrs;
Run Code Online (Sandbox Code Playgroud)
在我看来,编译器似乎有问题?由于问题出现在标准c ++库sstream中?这对我来说没有意义,我使用的是错误的编译器吗?
以下是错误消息所引用的代码片段:
1.)从第67行开始
class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
{
struct __xfer_bufptrs;
public:
Run Code Online (Sandbox Code Playgroud)
2.)在第300行进行流式传输
#if _GLIBCXX_USE_CXX11_ABI
// This type captures the state of the gptr / pptr pointers as offsets
// so they can be restored in another object after moving the string.
struct __xfer_bufptrs
{
__xfer_bufptrs(const basic_stringbuf& __from, basic_stringbuf* __to)
: _M_to{__to}, _M_goff{-1, -1, -1}, _M_poff{-1, -1, -1}
{
Run Code Online (Sandbox Code Playgroud)
我知道标准库不会有任何问题,为什么它会引发错误?
这是我最接近的答案:https : //github.com/PacificBiosciences/pbbam/issues/14
答案似乎围绕着这些“ Dprivate”和“ Dpublic”标志。我假设是编译器标志,但是我不确定它们会做什么。
尽管github上的主题很流行,但似乎没有找到原因。您很可能在项目中构建一些单元或其他测试,以重新定义“ private”关键字,如下所示:
#define private public
Run Code Online (Sandbox Code Playgroud)
或者通过(-Dprivate=public)之类的命令执行相应的操作。这是一种常见的做法,可以公开私有成员进行测试,而无需使测试代码依赖于测试代码。但是,请查看您的片段。__xfer_bufptrs无论您对的定义如何,第一个都会声明为私有private。接下来的第二个代码段肯定(尽管未检查)在显式private块中。现在,如果您对private的定义到位,您将public在第二个片段中找到答案,这是一个错误。
您至少有两个选择,其他当然也可以:
#undef在包含系统头之前先定义私有,然后在包含系统头后再次定义,或者#define my_public public可以随意重新定义。虽然这个解决方案似乎很棘手;)哦,为了将来使用自己的代码,请始终使用显式访问限制,以避免至少与您自己的代码发生这种混乱:)