这段代码无法在g ++ - 7.2和clang-5.0下编译,并且在g ++ - 5下完美编译(-std = c ++ 11)。
#include <vector>
template<typename T>
class Array : private std::vector<T> {
public:
typedef std::vector<T> Base;
using Base::Base;
};
int main() {
Array<int> a((int*)nullptr, (int*)nullptr);
}
错误出现在链接阶段:main.cpp:(.text+0x11): undefined reference to 'std::allocator<int>::allocator()'
。
如果我将我的数组声明为Array<int> a
,则它会完美编译。
这里的问题是什么?据我所知,模板Array<int>
的实例化强制实例std::vector<int>
,按顺序实例化std::allocator<int>
。
P.S。我知道从STL容器继承可能存在的缺陷。这里的继承是私有的,this回答声称它是允许的。无论如何,问题不在于它是否是一种好的做法。
P.P.S。如果你建议一个更好的头衔,我会很高兴。
答案 0 :(得分:1)
GCC7中继承的构造函数的语义发生了变化。但是,您可以使用{{1}}开关编译代码。
更多信息在GCC7更改日志中:https://gcc.gnu.org/gcc-7/changes.html和P0136。