Mac上初始化没有匹配构造函数

No Matching Constructor for Initialization on Mac

本文关键字:构造函数 初始化 Mac      更新时间:2023-10-16

我正在从编程:使用c++/Edition 2的原理和实践中学习c++,我遇到了向量的问题。我在这里使用Stroustrup的书中提供的头文件。当我编译下面的向量程序时,我得到了一个错误。

#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() { }
    ^

我正在编译:clang++ -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

我有麻烦的错误和警告的意义,不知道从这里去哪里。感谢您提供的宝贵意见。

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. 包含std_lib_facilities.h后可以#undef vector
  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);
        }
    };
    

链接的头文件有以下行:

#define vector Vector

这意味着当你写vector<int>时,编译器看到的是Vector<int>,这是他自己实现的向量。我没有看到一个构造函数从硬编码的数组中构建一个实例,就像你试图做的那样。

如果你包含了实际的标准库,它应该可以工作,因为你在c++ 11中编译(见这里)。虽然该向量不会在链接的头文件中添加范围检查