【发布时间】: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<int>::allocator()'。
如果我将我的数组声明为Array<int> a,它将完美编译。
这里有什么问题?据我了解,模板Array<int> 的实例化强制std::vector<int> 的实例化,它依次实例化std::allocator<int>。
附:我知道从 STL 容器继承可能存在的缺陷。这里继承是私有的,this 回答声称它是允许的。无论如何,问题不在于这是否是一种好习惯。
附言如果你建议一个更好的标题,我会很高兴。
【问题讨论】:
-
"在我的例子中,没有额外的数据成员,所以应该不会造成任何问题。" - 错误的想法。
-
好的,你说得对,我会将继承设为私有。这个答案声称它是允许的:stackoverflow.com/a/4357417/2159939。它仍然没有消除错误,我的问题不是关于从 STL 容器本身继承。
-
对我来说似乎是一个编译器错误
-
当你传递两个 nullptr 时会发生什么(如果可以编译)?
-
@manni66 我不关心运行时会发生什么,我只想从两个 int 指针(存在)调用构造函数,传递 nullptr-s 是最简单的方法。这是一个最小的例子,不是真正的代码。