我是C ++编程的新手,我想知道什么是“从这里实例化”错误?
struct Data {
Data(int a, int b) {
x = a;
y = b;
}
int x;
int y;
};
std::map<int, Data> m;
m[1] = Data(1, 2);
我收到了几条错误消息
感谢。
答案 0 :(得分:8)
struct Data
没有默认构造函数。 map::operator[]
返回其值类型的默认构造实例,在本例中为struct Data
。
提供默认构造函数:
Data() : x(0), y(0) {}
m.insert(std::pair<int, Data>(1, Data(1, 2)));
答案 1 :(得分:3)
C ++什么是“从这里实例化”错误?
这不是错误,而是继续添加额外信息的上一个错误。编译器正在添加error:
前缀,以便更容易读取(或解析)哪些行属于错误。
您可以将整个块读作一个错误:
没有匹配的函数调用Data::Data()
从...实例化
答案 2 :(得分:2)
您需要提供一个不带参数的构造函数。
Data::Data(){}
答案 3 :(得分:0)
这意味着只有当编译器开始解析(实例化)模板std::map::map()
时,错误(“无匹配函数调用”)才会变得明显。
答案 4 :(得分:0)
使用operator[]
将项目插入地图时,会发生的情况是地图会为指定的键引用默认构造的对象,然后将要分配的值复制到该默认值中构造对象。
要创建默认构造的对象,需要使用默认构造函数。在你的情况下,正确的你已经指定了一个带有两个参数的构造函数(并没有为这些参数提供默认值),编译器将不自动为你合成默认构造函数。
在这种情况下,我可能会将你的构造函数修改为:
Data(int a=0, int b=0) : x(a), y(b) {}
请注意,通常更喜欢在初始化列表中初始化变量(如果可能),而不是在构造函数的主体中分配它们。
答案 5 :(得分:0)
没有匹配函数来调用“Data :: Data()”
您需要提供默认构造函数。看到这个问题的答案:
Template Error: no appropriate default constructor available
“从此处实例化”错误
您只能在全局区域中拥有变量声明。您需要在函数内执行该分配。正确的代码:
#include <map>
struct Data {
Data(int a, int b) {
x = a;
y = b;
}
int x;
int y;
Data() {};
};
std::map<int, Data> m;
void main()
{
m[1] = Data(1, 2);
}