提问人: 提问时间:12/7/2021 更新时间:12/9/2021 访问量:337
如果结构包含构造函数,则无法使用初始值设定项列表来赋值
Unable to use initializer list to assign values if structure contains a constructor
问:
我正在使用初始值设定项列表创建对象并将其分配给带有键的地图。对于简单结构,可以使用初始值设定项列表创建临时结构。int
因此,我做这样的事情是完全有效的
struct fileJobPair {
int file;
int job;
};
map<int, fileJobPair> mp;
mp[1] = {10, 20};
mp[2] = {100, 200};
mp[3] = {1000, 2000};
但是如果我将构造函数添加到结构中,我会收到错误
file.cpp: In function ‘int main()’:
file.cpp:18:21: error: no match for ‘operator=’ (operand types are ‘std::map<int, fileJobPair>::mapped_type’ {aka ‘fileJobPair’} and ‘<brace-enclosed initializer list>’)
18 | mp[1] = {10, 20};
| ^
file.cpp:4:8: note: candidate: ‘constexpr AfileJobPair& AfileJobPair::operator=(const AfileJobPair&)’
4 | struct fileJobPair {
| ^~~~~~~~~~~~
file.cpp:4:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const fileJobPair&’
file.cpp:4:8: note: candidate: ‘constexpr fileJobPair& fileJobPair::operator=(fileJobPair&&)’
file.cpp:4:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘fileJobPair&&’
这是我尝试过的:
struct fileJobPair {
int file;
int job;
fileJobPair()
{
file = job = 0;
}
};
int main()
{
map<int, fileJobPair> mp;
mp[1] = {10, 20};
mp[2] = {100, 200};
mp[3] = {1000, 2000};
for(int i =1;i<=3;i++)
{
cout<< mp[i].file <<" "<< mp[i].job<<endl;
}
return 0;
}
为什么我会收到错误,它到底是如何在内部工作的?
答:
0赞
riquefr
12/7/2021
#1
当你创建一个 ,默认情况下,它将使用你的空构造函数,因此将不再可用来完成。但是你可以向它添加一个新的构造函数,它接收 2 个整数并将它们绑定到相应的值,如下所示:fileJobPair
{}
#include <iostream>
#include <map>
using namespace std;
struct fileJobPair {
int file;
int job;
fileJobPair() {
file = job = 0;
}
fileJobPair(int a, int b) {
file = a;
job = b;
}
};
int main()
{
map<int, fileJobPair> mp;
mp[1] = {10,10};
mp[2] = {100, 200};
mp[3] = {1000, 2000};
for(int i =1;i<=3;i++)
{
cout<< mp[i].file <<" "<< mp[i].job<<endl;
}
return 0;
}
评论
0赞
12/7/2021
哦,但是当文档说时,这是如何工作的no user-declared constructors no user-provided constructors
0赞
riquefr
12/7/2021
我不知道允许它的 C++ 语言上的实现,但我认为这是因为它现在知道您可以使用 2 整数值来初始化结构,当您使用空构造函数时,它没有办法知道。
评论
fileJobPair
具有默认构造函数,因此不能使用初始化器来初始化它map
fileJobPair f; f = {10,20};
fileJobPair