2016-11-05 2 views
1

Я изучаю C++ от программирования: принципы и практика с использованием C++/Edition 2, и у меня возникла проблема с векторами. Я использую включенный заголовочный файл, предоставленный из книги Страустрапа here. Когда я компилирую следующую векторную программу, я получаю сообщение об ошибке.Нет сопоставления конструктора для инициализации на Mac

#include "std_lib_facilities.h" 

int main() 
{ 
    vector<int> v = {5, 7, 9, 4, 6, 8}; 
    for (int i=0; i<v.size(); ++i) 
     cout << v[i] << endl; 
} 

Ошибка

vector.cpp:5:21 error: no matching constructor for initialization of 'Vector<int>' 
    vector<int> v = {5, 7, 9, 4, 6, 8}; 
       ^ ~~~~~~~~~~~~~~~~~~ 
./std_lib_facilities.h:82:5: note: candidate constructor template not viable: 
     requires 2 arguments, but 6 were provided 
    Vector(I first, I last) :std::vector<T>(first, last) {} 
    ^
./std_lib_facilities.h:79:14: note: candidate constructor not viable: requires 2 
     arguments but 6 were provided 
    Vector(size_type n, const T& v) :std::vector<T>(n,v) {} 
    ^
./std_lib_facilities.h:79:14: note: candidate constructor not viable: requires 
     single argument 'n', but 6 arguments were provided 
    explicit Vector(size_type n) :std::vector<T>(n) {} 
./std_lib_facilities.h:75:27: note: candidate constructor (the implicit move 
     constructor) not viable: requires 1 argument, but 6 were provided 
    template< class T> struct Vector : public std::vector<T> { 
          ^
./std_lib_facilities.h:75:27: note: candidate constructor (the implicit copy 
    constructor) not viable: requires 1 argument but 6 were provided 
./std_lib_facilities.h:78:5: note: candidate constructor not viable: requires 0 
     arguments, but 6 were provided 
    Vector() { } 
    ^

Я компиляции с: лязгом ++ -std = C++ 11 -stdlib = LibC++ vector.cpp

Когда я проверяю свою версию Clang, я получаю :

Apple LLVM Version 8.0.0 (clang-800.0.42.1) 
Target: x86_64-apple-darwin16.1.0 
Thread model: posse 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

У меня возникли проблемы с пониманием ошибки и предупреждений и не знаю, куда идти отсюда. Благодарим вас за любую информацию, которую вы можете предоставить.

+1

C++ чувствителен к регистру. –

+0

@KerrekSB Ststustrup 'std_lib_facilities.h' имеет' #define vector Vector'. http://www.stroustrup.com/Programming/std_lib_facilities.h Не могу сказать, что я поклонник этого, хотя ... – krzaq

+0

использовать STL из вашего компилятора –

ответ

1

std_lib_facilities.h определяет класс Vector<T> как:

template< class T> struct Vector : public std::vector<T> { 
    typedef typename std::vector<T>::size_type size_type; 

    Vector() { } 
    explicit Vector(size_type n) :std::vector<T>(n) {} 
    Vector(size_type n, const T& v) :std::vector<T>(n,v) {} 
    template <class I> 
    Vector(I first, I last) :std::vector<T>(first,last) {} 

    T& operator[](unsigned int i) // rather than return at(i); 
    { 
     if (i<0||this->size()<=i) throw Range_error(i); 
     return std::vector<T>::operator[](i); 
    } 
    const T& operator[](unsigned int i) const 
    { 
     if (i<0||this->size()<=i) throw Range_error(i); 
     return std::vector<T>::operator[](i); 
    } 
}; 

// disgusting macro hack to get a range checked vector: 
#define vector Vector 

Как вы можете видеть, что нет initializer_list конструктора.

На данный момент ваши возможности ограничены.

  1. Вы можете отказаться от использования std_lib_facilities.h
  2. Вы можете #undef vector после включения std_lib_facilities.h
  3. Вы можете заменить Vector шаблон класса Конструкторы унаследовал конструкторов (using vector<T>::vector;):

    template< class T> struct Vector : public std::vector<T> { 
        typedef typename std::vector<T>::size_type size_type; 
    
        using std::vector<T>::vector; 
    
        T& operator[](unsigned int i) // rather than return at(i); 
        { 
         if (i<0||this->size()<=i) throw Range_error(i); 
         return std::vector<T>::operator[](i); 
        } 
        const T& operator[](unsigned int i) const 
        { 
         if (i<0||this->size()<=i) throw Range_error(i); 
         return std::vector<T>::operator[](i); 
        } 
    }; 
    
+0

Спасибо за быстрый ответ, krzaq! Я еще не понимаю заголовочный файл, поэтому я не уверен, что использует вектор #undef или какие конструкторы шаблонов классов. Я пошел вперед и заменил шаблон класса «Вектор», как вы сказали, и он работает. Я просто не уверен, что это я заменил, и то, что я заменил. – mjdn

+0

@mjdn, вы, вероятно, узнаете в следующих главах :) – krzaq

0

Связанный заголовок файл имеет строку:

#define vector Vector

что означает, когда вы пишете vector<int> компилятор видит Vector<int>, который является его собственная реализация вектора. Я не видел конструктора, который строит экземпляр из жестко закодированного массива, как вы пытаетесь сделать.

Если вы включили фактическую стандартную библиотеку, она должна работать, поскольку вы компилируете в C++ 11 (см. here). Хотя этот вектор не будет проверяться диапазоном в связанном файле заголовка.