繁体   English   中英

为什么删除我的基类构造函数之一? (C ++ 11)

[英]Why is one of my base class constructors deleted? (C++11)

我编写了一个简单的C ++ 11程序,在其中创建了一个从std::vector派生的类:

#include <vector>

using namespace std;

template <typename T>
class my_vec : public vector<T> {
public:
  using vector<T>::vector;
};

int main() {
  my_vec<int> v0;
  my_vec<int> v1 { 1, 2, 3, 4, 5 };
  my_vec<int> v2 ( 42 );
  my_vec<int> v3 ( v1 );
  my_vec<int> v4 ( v1.begin()+1, v1.end()-1 );
  return 0;
}

当然, my_vecstd::vector之上并没有做任何事情,但这是因为我删除了所有缩小我的错误的额外功能。 该程序在Linux上的g ++ 4.8.1上可以正常编译,但是在OS X上使用clang 500.2.79时,出现以下错误:

myvec.cpp:16:15: error: call to deleted constructor of 'my_vec<int>'
  my_vec<int> v4 ( v1.begin()+1, v1.end()-1 );
              ^    ~~~~~~~~~~~~~~~~~~~~~~~~
myvec.cpp:8:20: note: function has been explicitly marked deleted here
  using vector<T>::vector;
                   ^
1 error generated.

为什么clang坚持std::vector的范围构造函数已被删除? 所有其他构造函数似乎都已经继承了。

范围构造器不是常规方法,而是模板方法,这可能与事实有关。

template< class InputIt >
vector( InputIt first, InputIt last, 
    const Allocator& alloc = Allocator() );

您的OS X编译器基于llvm clang-3.3(在Google上进行了检查),从此站点http://clang.llvm.org/cxx_status.html看来,继承构造函数应该在3.3版中可用,但看起来像在此版本中,实现是错误的。

我用clang 3.5检查了ubuntu,示例代码可以正常编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM