这是构造函数问题(引用已删除的函数)吗? (错误代码C2280)

时间:2018-11-18 16:40:27

标签: c++ constructor user-defined-types

我有一个“令牌”类和一个“令牌流”类,如下面的代码所示。 当我尝试创建Token_Stream类的对象时,出现编译错误:(C2280)'Token_stream :: Token_stream(void)':尝试引用已删除的函数

我正在使用C ++ Visual Studio Community 15.9.1。我是Stroustrup的PPP C ++ 2nd Edition中“现代”编程和C ++自学的新手。我在该站点上搜索“ c ++试图引用已删除的函数c2280”时已阅读了许多结果,但没有一个能帮助我解决问题。

尽管阅读了一些有关它们的网页和书籍部分,但我对构造函数的理解还不完整,但我足够理解(我认为)认为这是构造函数问题。我肯定会在用户定义的类中苦苦挣扎,该类包括一个成员,该成员是另一个用户定义的类以及成员函数。

代码在下面。如果Token_stream的两个成员函数的声明有帮助,请告诉我,然后将它们添加。

class Token {
public:
    char kind;
    double value;
    Token(char ch)    // make a Token from a char 
   //- this is a constructor, right?
        :kind(ch), value(0) { } // what do the braces here mean?
    Token(char ch, double val)     // make a Token from a char and a double
        :kind(ch), value(val) { }
};

class Token_stream {
public:
    Token get();
    void putback(Token t);
private:
    bool full{ false };
    Token buffer;   
//  Token_stream() = default;
};

Token_stream ts;    // ERROR C2280 here
// Token_stream::Token_stream(void)': attempting
// to ref. a deleted function

1 个答案:

答案 0 :(得分:0)

问题是您的Token班。您没有Token的默认构造函数,但您在Token buffer;中有一个成员属性Token_stream,它将在实例化Token_stream时初始化。 Token没有默认的构造函数。因此,编译器无法为Token_stream添加默认构造函数。

gcc 8.2显示以下错误/注释:

note: 'Token_stream::Token_stream()' is implicitly deleted because the default 
definition would be ill-formed

error: no matching function for call to 'Token::Token()'

这显示了为Token_stream创建默认构造函数的问题。

您只需为Token添加一个默认构造函数,它就可以工作。enter code here