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

时间:2012-04-03 15:07:50

标签: c++ struct std

我是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()”
  • “从此处实例化”错误

感谢。

6 个答案:

答案 0 :(得分:8)

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

提供默认构造函数:

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

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

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