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

Posted

技术标签:

【中文标题】从 std::vector 继承时 g++ 7 中的未定义引用【英文标题】:Undefined reference in g++ 7 when inheriting from std::vector 【发布时间】:2017-10-26 21:30:10 【问题描述】:

这是一段代码,在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&lt;int&gt;::allocator()'

如果我将我的数组声明为Array&lt;int&gt; a,它将完美编译。

这里有什么问题?据我了解,模板Array&lt;int&gt; 的实例化强制std::vector&lt;int&gt; 的实例化,它依次实例化std::allocator&lt;int&gt;

Demo with g++-5

Demo with g++-7

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

附言如果你建议一个更好的标题,我会很高兴。

【问题讨论】:

"在我的例子中,没有额外的数据成员,所以应该不会造成任何问题。" - 错误的想法。 好的,你说得对,我会将继承设为私有。这个答案声称它是允许的:***.com/a/4357417/2159939。它仍然没有消除错误,我的问题不是关于从 STL 容器本身继承。 对我来说似乎是一个编译器错误 当你传递两个 nullptr 时会发生什么(如果可以编译)? @manni66 我不关心运行时会发生什么,我只想从两个 int 指针(存在)调用构造函数,传递 nullptr-s 是最简单的方法。这是一个最小的例子,不是真正的代码。 【参考方案1】:

GCC7 中继承的构造函数的语义发生了变化。但是,您可以使用-fno-new-inheriting-ctors 开关编译您的代码。

更多信息在 GCC7 更新日志中:https://gcc.gnu.org/gcc-7/changes.html 和 P0136。

【讨论】:

当变更日志显示“大多数用途不需要任何更改”时的那种感觉,你会受到某种影响。

以上是关于从 std::vector 继承时 g++ 7 中的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

从 std::vector 继承的这个类声明有啥问题吗?

来自 GCC 的未定义参考错误使用带有 std::vector 和特征矩阵的模板?

使用模板时如何从 std::vector 中删除元素?

将数据从 std::Vector 存储到 Eigen::Vector 时出错 [重复]

从 C++ std::vector 中删除元素

为啥从 std::vector 中随机删除比 std::list 快?