从std :: vector继承时,g ++ 7中的未定义引用

时间:2017-10-26 21:30:10

标签: c++ g++

这段代码无法在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>

Demo with g++-5

Demo with g++-7

P.S。我知道从STL容器继承可能存在的缺陷。这里的继承是私有的,this回答声称它是允许的。无论如何,问题不在于它是否是一种好的做法。

P.P.S。如果你建议一个更好的头衔,我会很高兴。

1 个答案:

答案 0 :(得分:1)

GCC7中继承的构造函数的语义发生了变化。但是,您可以使用{{1}}开关编译代码。

更多信息在GCC7更改日志中:https://gcc.gnu.org/gcc-7/changes.htmlP0136