【问题标题】:error: no matching function for call to 'std::reference_wrapper<Medium>::reference_wrapper()错误:没有匹配函数调用 'std::reference_wrapper<Medium>::reference_wrapper()
【发布时间】:2017-12-16 19:16:57
【问题描述】:

BookArticleMedium 的派生类。

为什么我在尝试在参考书目中插入 Medium / Book / Article 时收到此错误?

error: no matching function for call to '**std::reference_wrapper<Medium>::reference_wrapper()**

ma​​in.cc

#include <iostream>
using namespace std;
#include "Bibliography.h"
#include "Medium.h"
#include "Book.h"
#include "Article.h"

int main()
{
    Bibliography p(1);
    Medium m1("PN","I","Pasol nah",2017);
    p.insert(m1);
    cout << p;
    return 0;
}

参考书目.h

#ifndef BIBLIOGRAPHY_H_
#define BIBLIOGRAPHY_H_

#include "Medium.h"
#include "Article.h"
#include "Book.h"
#include <iostream>
#include <functional>
#include <vector>

class Bibliography
{
  private:
    int m_Size;
    std::vector<std::reference_wrapper<Medium>> v;
    int index;
  public:
    Bibliography(int size);
    void insert(Medium m);
    friend std::ostream& operator<<(std::ostream& out, const Bibliography &b1);
};

#endif

参考书目.cc

#include "Bibliography.h"

Bibliography::Bibliography(int size)
{
    std::cout << "Bibliography created \n";
    m_Size = size;
    v.resize(m_Size);
    index = 0;
}

void Bibliography::insert(Medium m)
{
    v.push_back(m);
}

std::ostream& operator<<(std::ostream& out, const Bibliography &b1)
{
    for (Medium &Medium : b1.v)
    {
        out << Medium.toString() << std::endl;
    }
    return out;
}

【问题讨论】:

    标签: c++ stdvector reference-wrapper


    【解决方案1】:

    你不应该在vector中使用reference_wrapper,因为vector可以保留有默认构造函数的对象,reference_wrapper没有,看看reference_wrapper的这些构造函数:

    initialization (1)  
    reference_wrapper (type& ref) noexcept;
    reference_wrapper (type&&) = delete;
    copy (2)    
    reference_wrapper (const reference_wrapper& x) noexcept;
    

    在这一行

    v.resize(m_Size); 
    

    您想创建 m_Size reference_wrapperobjects,但 reference_wrapper 的默认构造函数不存在,代码无法编译。

    您可以将reference_wrappervector 一起使用,但会出现编译错误 当调用vector的方法需要定义默认构造函数时。

    【讨论】:

    • 这是真的吗? C++ 参考专门uses a vector 作为reference_wrapper 的示例用法。
    • 在您发布的示例中,有一个包含 10 个元素的列表。 list&lt;int&gt; l(10); 向量保持reference_wrapper&lt;int&gt;,当这个向量被创建时v(l.begin(),l.end())reference_wrapper 的构造函数被调用,它以左值作为参数,存储指向这些左值的指针,所以在这种情况下vector+reference_wrapper 有效。但是不能调用向量上的resize,因为resize 调用reference_wrapper 的默认ctor。 reference_wrapper 需要存储指向某个对象的指针(需要初始化引用)。因此,reference_wrapper 的默认 ctor 不存在。
    • 非常感谢。如果 C++ 参考包含这样的示例,将会更有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2012-03-19
    • 1970-01-01
    • 2020-02-09
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多