因此,当我使用std::vector::erase
调用const_iterator
并且如果失败时,我深入研究了我的容器类的擦除方法。就像它对this person所做的那样。
点击gnu libstdc++ status的链接显示此问题仍未解决(原始问题是2013年初)。
所以我编写了一个可怕的黑客攻击:
#if 1
// horrible hack for gnu libstd++ deficit
// current implementation does not allow erase(const_iterator), so recreate plain iterator
off_t::iterator itx= offsets_.begin() + ( apos.iter() - offsets_.begin() ) ;
#else
// for compliant implementations
auto itx= apos.iter() ;
#endif
但我想知道是否#define
我可以使用与libstdc++
版本的关联。有很多可以测试编译器的版本,但我不认为gcc
版本将是一个很好的指标,以解决何时修复,并且clang
使用相同的库默认我需要抓住它。我看一下g++ -E -dM - < /dev/null
的输出,但是只提到STD
的人似乎没有承诺:
#define __STDC_HOSTED__ 1
#define __STDC_IEC_559__ 1
#define __STDC_ISO_10646__ 201103L
#define __STDC_NO_THREADS__ 1
#define _STDC_PREDEF_H 1
#define __STDC_IEC_559_COMPLEX__ 1
#define __STDC__ 1
答案 0 :(得分:3)
反正你不会和clang挂钩吗?如果它是由gcc发行版固定的,是否可以通过clang确定,反之亦然?其他编译器怎么样?
您可以获取compiler defines
的列表例如
#define __GNUC_PATCHLEVEL__
#define __GNUC__
#define __GNUC_MINOR__
或clang
#define __clang__
#define __clang_major__
#define __clang_minor__
#define __clang_patchlevel__
您使用autotools吗?如果是这样,那么既然你正在考虑将自己宏观化,那么你可以创建一个autotools测试来创建你自己的定义。测试不需要编译,实际上通常是测试。