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

Is this a constructor problem (referencing deleted function)? (error code C2280)

我有一个class‘Token’和一个class‘Token_Stream’,如下代码所示。 当我尝试创建 class Token_Stream 的对象时,出现编译错误:(C2280) 'Token_stream::Token_stream(void)': attempting to reference a deleted function

我正在使用 C++ Visual Studio 社区 15.9.1。我是 "modern" 编程的新手,并从 Stroustrup 的书 PPP C++ 第 2 版自学 C++。我已经阅读了很多在本网站搜索 "c++ attempting to reference a deleted function c2280," 的结果,但 none 帮助我解决了问题。

我对构造函数的理解是不完整的,尽管阅读了几个关于它们的网页和书籍部分,但我的理解足以(我认为)认为这是一个构造函数问题。我肯定在与用户定义的 class 作斗争,它包括一个成员,该成员是另一个用户定义的 class 加上成员函数。

代码如下。如果 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

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

gcc 8.2 显示以下 error/note:

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