Это проблема конструктора (ссылка на удаленную функцию)?(код ошибки C2280) - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть класс 'Token' и класс 'Token_Stream', как показано в коде ниже.Когда я пытаюсь создать объект класса Token_Stream, я получаю ошибку компиляции: (C2280) 'Token_stream :: Token_stream (void)': попытка сослаться на удаленную функцию

Я использую сообщество C ++ Visual Studio15.9.1.Я новичок в "современном" программировании и обучаю себя C ++ из книги Страуструпа PPP C ++ 2-е издание.Я прочитал многие результаты поиска по этому сайту «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 голосов
/ 18 ноября 2018

Проблема в вашем 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

...