若结构包含构造函数,则无法使用初始值设定项列表来赋值



我使用初始值设定项列表创建对象,并用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;
}

为什么我会出错,它在内部究竟是如何工作的?

当您创建一个新的fileJobPair时,默认情况下它将使用您的空构造函数,因此将无法再使用{}来完成。但是您可以添加一个新的构造函数,它接收2个整数并将它们绑定到各自的值,如下所示:

#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;
}

最新更新