我有一个“令牌”类和一个“令牌流”类,如下面的代码所示。 当我尝试创建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
答案 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