Book
和Article
是来自Medium
的派生类。
为什么在尝试在参考书目中插入Medium
/ Book
/ Article
时出现此错误?
error: no matching function for call to '**std::reference_wrapper<Medium>::reference_wrapper()**
main.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;
}
Bibliography.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
Bibliography.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;
}
答案 0 :(得分:1)
您不应在reference_wrapper
中使用vector
,因为vector
可以保留具有默认构造函数的对象,reference_wrapper
没有它,请查看reference_wrapper
的这些构造函数{1}}:
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_wrapper
个对象,但reference_wrapper
的默认构造函数不存在,并且无法编译代码。
您可以将reference_wrapper
与vector
一起使用,但会出现编译错误
当调用vector的方法时,需要定义默认构造函数。