2014-02-14 5 views
2

Я написал простой C++ 11 программа, в которой я создаю класс, который является производным от std::vector:Почему один из моих конструкторов базового класса удален? (C++ 11)

#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_vec Предоставленный, не делает ничего сверх std::vector, но это потому что я удалил все свои дополнительные функции в сужении моей ошибки. Эта программа отлично компилируется на г ++ 4.8.1 на Linux, но при использовании лязг 500.2.79 на OS X, это дает мне следующую ошибку:

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. 

Почему лязг настоять, что диапазон конструктора std::vector «s был удален ? Все остальные конструкторы, похоже, были унаследованы просто отлично.

+0

[Скомпилирует для меня] (http://ideone.com/wTNQrN) – user3286380

+0

Мой 'clang' делает то же самое, и я уверен, что это потому, что они являются шаблонами-конструкторами. Я должен был бы погрузиться в документы, чтобы узнать, является ли это ошибкой или стандартным. – WhozCraig

+4

Имейте в виду, что 'std :: vector' не имеет виртуального деструктора и не предназначен для использования в качестве базового класса. –

ответ

1

Ваш OS X компилятор основан на LLVM лязг-3,3 (проверено на Google), с этого сайта http://clang.llvm.org/cxx_status.html это выглядит как унаследовать конструкторы должны быть доступны, начиная с версии 3.3, но это выглядит как его реализация глючит в этом версия.

Я проверил на ubuntu с clang 3.5 и ваш пример кода компилируется в порядке.

3

Вероятно, это связано с тем, что конструктор диапазона не является обычным методом, а методом шаблона.

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

Это не имеет значения, и его код действителен и компилируется в новых компиляторах. – user3286380

+0

Я не говорю, что это нужно, но это одно из самых значительных различий между этим конструктором и другими. –

Смежные вопросы