我正在尝试使用引用包装器的 vector 运行示例,但在 vector 变量声明时遇到编译错误。这是代码:
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
struct Base
{
virtual void print() = 0;
};
struct X1: public Base
{
void print() override
{
cout << "X1\n";
}
};
struct X2: public Base
{
void print() override
{
cout << "X2\n";
}
};
int main()
{
X1 x1;
X2 x2;
vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};
}
具有std::initializer_list
的 vector 构造函数存在。传递值的类型必须是 const T
,std::cref
返回,所以它为什么会报错:
/home/u1/sandbox/c++/trash/untitled/main.cpp:33: error: no matching function for call to ‘std::vector<std::reference_wrapper<Base> >::vector(<brace-enclosed initializer list>)’
vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};
^
? (如果重要,使用 gcc -std=c++17 构建)
最佳答案
你正在用 const
包装器初始化一个非 const
Base
:
vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};
改用 const Base
:
vector<reference_wrapper<const Base>> X{cref(x1), cref(x2)};
关于c++ - 使用 reference_wrappers 初始化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758566/