使用带有初始化列表的Stroustrup的PPP书中的向量时出现编译错误

时间:2017-02-22 12:51:21

标签: c++ visual-studio

我的代码:

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include "c:\Users\1\documents\visual studio 2015\std_lib_facilities.h"

int main()
{
    vector<int> v = { 5, 7, 9, 4, 6, 8 };
    return 0;
}

无法使用此错误进行编译:

Severity    Code    Description Project File    Line    Suppression State   Detail Description
Error (active)      no instance of constructor "Vector<T>::Vector [with T=int]" matches the argument list   ConsoleApplication1 c:\Users\1\Documents\Visual Studio 2015\Projects\ConsoleApplication1\Source.cpp 6                   argument types are: (int, int, int, int, int, int)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您似乎使用了错误版本的std_lib_facilities.h。std_lib_facilities.h中的Vector没有initializer_list构造函数。所以你不能用这个版本的标题做到这一点。

// trivially range-checked vector (no iterator checking):
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

答案 1 :(得分:2)

您使用的是错误版本的Stroustrup标头。您使用的那个属于第一版PPP,使用here中的新版本,代码工作正常。

然后你也可以摆脱那个遗产修复

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS