C++什么是"instantiated from here"错误?

C++ what is "instantiated from here" error?

本文关键字:here 错误 from instantiated 什么 C++      更新时间:2023-10-16

我是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);

我收到了几个错误信息

  • 对"Data::Data()"的调用没有匹配的函数
  • "从这里实例化"错误

谢谢。

struct Data没有默认构造函数。map::operator[]返回其值类型的默认构造实例,在本例中为struct Data

要么提供默认构造函数:

Data() : x(0), y(0) {}

或使用std::map::insert():

m.insert(std::pair<int, Data>(1, Data(1, 2)));

C++什么是"从这里实例化"错误?

这不是一个错误,而是上一个错误的延续,添加了额外的信息。编译器添加了error:前缀,以便更容易读取(或解析)属于错误的行。

您可以将整个块读取为单个错误:

从中实例化的Data::Data()没有匹配的函数调用

您需要提供一个不带参数的构造函数。

Data::Data(){}

这意味着只有当编译器开始解析(实例化)模板std::map::map()时,错误("无匹配函数调用"错误)才会变得明显。

当您使用operator[]将一个项目插入到映射中时,映射会为指定的键插入一个默认构造的对象来引用,然后您分配的值会复制到该默认构造对象中。

要创建默认构造的对象,需要有一个可用的默认构造函数。在您的情况下,如果您指定了一个接受两个参数的构造函数(并且没有为这些参数提供默认值),编译器将自动为您合成一个默认构造函数。

在这种情况下,我可能会把你的构造函数修改成这样:

Data(int a=0, int b=0) : x(a), y(b) {}

请注意,您应该通常更喜欢初始化列表中的变量(如果可能的话),而不是在构造函数的主体中为它们赋值。

调用"Data::Data()"时没有匹配的函数

您需要提供一个默认构造函数。查看此问题的答案:

模板错误:没有合适的默认构造函数可用

"从这里实例化"错误

在全局区域中只能有变量声明。你需要在一个函数中完成这项任务。正确代码:

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