如果结构包含构造函数,则无法使用初始化列表来赋值
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;
}
为什么我会收到错误消息,它在内部究竟是如何工作的?
当您创建一个新的 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;
}
根据文档,只有当您的 structure/class 不包含
时,您才可以使用初始化列表
- 没有私有或受保护的直接非静态数据成员
- 没有用户声明的构造函数
- 没有用户提供的构造函数(允许明确默认或删除的构造函数)
- 没有用户提供的、继承的或显式的构造函数(允许显式默认或删除的构造函数)
- 没有用户声明或继承的构造函数
- 没有虚拟、私有或受保护的基地类
- 没有虚拟成员函数
- 没有默认的成员初始值设定项
在你的例子中,你的结构有一个用户声明的构造函数。
如 OP 的评论所述,@riqefr 的回答有效,文档中另有说明。
你需要了解聚合是什么,
聚合是一个数组或类,没有用户声明的构造函数、没有私有或受保护的非静态数据成员、没有基 类 和虚函数。
因此,当您将用户定义的构造函数添加到您的结构时,它不再是一个聚合。
了解更多聚合相对于常规 类 的优势。请参考https://www.educba.com/c-plus-plus-aggregation/
我使用初始化列表创建对象并使用 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;
}
根据文档,只有当您的 structure/class 不包含
时,您才可以使用初始化列表- 没有私有或受保护的直接非静态数据成员
- 没有用户声明的构造函数
- 没有用户提供的构造函数(允许明确默认或删除的构造函数)
- 没有用户提供的、继承的或显式的构造函数(允许显式默认或删除的构造函数)
- 没有用户声明或继承的构造函数
- 没有虚拟、私有或受保护的基地类
- 没有虚拟成员函数
- 没有默认的成员初始值设定项
在你的例子中,你的结构有一个用户声明的构造函数。
如 OP 的评论所述,@riqefr 的回答有效,文档中另有说明。
你需要了解聚合是什么,
聚合是一个数组或类,没有用户声明的构造函数、没有私有或受保护的非静态数据成员、没有基 类 和虚函数。
因此,当您将用户定义的构造函数添加到您的结构时,它不再是一个聚合。
了解更多聚合相对于常规 类 的优势。请参考https://www.educba.com/c-plus-plus-aggregation/