【问题标题】:std::initializer_list constructor leading to compiler errors C3202, C2661 and C2976std::initializer_list 构造函数导致编译器错误 C3202、C2661 和 C2976
【发布时间】:2019-09-28 22:58:04
【问题描述】:

我正在使用 C++ 教科书中包含的图形库,它对应该创建由直线组成的对象的形状具有以下定义。

 struct Lines : Shape {  // independent lines
    Lines() {}
    Lines(initializer_list<Point> lst)
        : Shape{ lst }
    {
        if (lst.size() % 2)
            error("odd number of points for Lines");
    }
    Lines(initializer_list<pair<Point>> lst)
    {
        for (auto p : lst) add(p.first, p.second);
    }
    void draw_lines() const;
    void add(Point p1, Point p2) { Shape::add(p1); Shape::add(p2); }
}

但是,当我尝试创建 Lines 结构的实例时,如下所示:

Lines rec(Point{ 200,200 }, Point{ 100,100 }, Point{350,250});

我收到错误 C2976、C2228 和 C3202,说明:

C2976 - “std::pair': 模板参数太少”

C2228 - “pair”:未专门化的类模板不能用作 模板 模板参数 '_Elem' 的参数,需要一个真实类型"

C2661 -“Graph_lib::Lines::Lines”:没有重载函数需要 3 论据”

我的印象是,initializer_list 构造函数允许使用与参数相同类型的多个元素来初始化一个对象。

【问题讨论】:

标签: c++ class c++11 constructor stdinitializerlist


【解决方案1】:

首先对于std::pair,您应该指定两种类型:std::pair&lt;Point, Point&gt;

其次,您应该将std::initializer_list 作为单个参数传递:

Lines rec({ Point{ 200,200 }, Point{ 100,100 }, Point{350,250} });

【讨论】:

  • 这样做会导致链接器错误。即:LNK2019和LNK1120。
  • 这是另一种错误。编译阶段成功完成。错误码不够用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多