首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误C2797 :成员初始化程序列表中的列表初始化

错误C2797 :成员初始化程序列表中的列表初始化
EN

Stack Overflow用户
提问于 2015-01-02 11:34:17
回答 3查看 7.2K关注 0票数 6

我在看MVA关于C++的教程,下面提到的代码是凯特写的,不是我写的。不过,她似乎没有编译,但在我的例子中,我得到了以下错误:

错误1错误C2797:“名称:_name”:成员初始化程序列表中的列表初始化或非静态数据成员初始化程序未实现c:\user\abhimanyuaryan\documents\visual studio 2013\projects\kate demos\17继承\named矩形angle.h121继承

代码中的第12行来自我的NameRectangle类,它继承自Rectangle类:

代码语言:javascript
运行
复制
class NamedRectangle :  public Rectangle
{
public:
    NamedRectangle() { }

    NamedRectangle(std::string initial_name, int initial_width, int initial_height)
        : Rectangle{ initial_width, initial_height }, _name{ initial_name } //--> This line
    {}  

std::string get_name() const { return _name; }

private:
    std::string _name;

};

当我将std::string initial_name从构造函数和_name{initial_name}中删除时,代码会编译。请解释我没有把我作为一个更高的标准,经验丰富的程序员。我昨天才开始做C++。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-27 12:07:33

在我和James编写MVA日和今天使用的代码之间,编译器发生了变化。现在发生的是

代码语言:javascript
运行
复制
 _name{ initial_name }

正在被解释为创建包含一个项的初始化程序列表,并使用该列表初始化成员变量。但你做不到。

解决方法是切换到圆括号:

代码语言:javascript
运行
复制
 _name(initial_name)

这给许多人造成了混乱,我至少有一个客户端被破坏了工作代码。

票数 8
EN

Stack Overflow用户

发布于 2015-08-15 02:28:45

tl;博士:凯特答案中的解决方案适用于OP;解释是不正确的。所讨论的代码实际上是正确的,并且确实在VS2015中编译。这个错误(在VS2013更新3中)是由于MS如何处理在VS2013 RTM中发现的错误(他们实际上并没有用更新来修复它,但确实破坏了一些工作代码)。它在VS2015中是正确的。

您的代码在VS2015中运行良好。据微软称,在VS2013,

是的,我们将这些错误插入更新3中的编译器中,因为我们的非静态数据成员初始化的实现是不完整的。

在VS2013中,成员初始化列表/大括号初始化也会中断。它们的实现存在的问题是具有图解最佳vector,它有一个initializer_list构造函数,应该贪婪地将其与使用带可转换参数的大括号的初始化匹配,但它没有这样做:

代码语言:javascript
运行
复制
struct S {
    S() : v1{1} {} // C2797, VS2013 RTM incorrectly calls 'vector(size_type)'

    std::vector<int> v1;
    std::vector<int> v2{1, 2}; // C2797, VS2013 RTM incorrectly calls 
                               // 'vector(size_type, const int &)'
};

编译器太容易回到正常的过载解析。它不使用std::initializer_list构造函数,而是调用size_t构造函数。正如他们的评论所示,这是错误的!因此,由于它们的实现存在缺陷,Microsoft决定禁用在此上下文中使用带支撑初始化的能力。

对于一个std::string s,应该没有问题,因为对s{"duh"} 来说,正确的事情是调用std::string(const char*),但是由于缺陷,MS无论如何都会给出一个错误。解决办法是显式地使用括号代替大括号(或升级到VS2015),正如凯特的答案所述。但是,错误的正确原因正如上面所述。

这适用于非静态数据成员初始化(NSDMI)以及初始化列表.这一点在这个Visual C++团队博客中有更多的解释。至于为什么VS2013从未被修复:

我们最初计划在Visual 2013的更新中修复这个错误,但从工程的角度来看,正确的做法是避免另一个杂念,彻底解决初始化的处理。但是,由于需要修改大量的基本代码,所以修改编译器架构是一项艰巨的任务。我们不能冒险在更新中创建不兼容或大错误尾,因此NSDMI的正确实现只能在主要版本中发布。

显然,该修复程序已进入Visual 2015,但将永远不会更新到2013年。

票数 13
EN

Stack Overflow用户

发布于 2015-01-25 21:42:04

我来解决它。

代码语言:javascript
运行
复制
class Namedrectangle : public Rectan
{
    public:
    Namedrectangle(){}

    Namedrectangle(string intname, int init_width, int init_height) 
         : Rectan{ init_width, init_height }
    {
        this->_name=intname;************
    }

    string get_name() const
    {
        return _name;
    }

    private:
    string _name;
};

我认为İt不能初始化,因为变量找不到或加载

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27741521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档