ошибка компиляции при попытке унаследовать от std :: runtime_error - PullRequest
6 голосов
/ 27 августа 2011

Я пытаюсь скомпилировать это с g ++ под Ubuntu:

#ifndef PARSEEXCEPTION_H
#define PARSEEXCEPTION_H

#include<exception>
#include<string>
#include<iostream>

struct ParseException : public std::runtime_error
{
    explicit ParseException(const std::string& msg):std::runtime_error(msg){};
    explicit ParseException(const std::string& token,const std::string& found):std::runtime_error("missing '"+token+"',instead found: '"+found+"'"){};

};

#endif

Я получаю сообщение об ошибке:

In file included from parseexception.cpp:1:
parseexception.h:9: error: expected class-name before ‘{’ token
parseexception.h: In constructor ‘ParseException::ParseException(const std::string&)’:
parseexception.h:10: error: expected class-name before ‘(’ token
parseexception.h:10: error: expected ‘{’ before ‘(’ token
parseexception.h: In constructor ‘ParseException::ParseException(const std::string&, const std::string&)’:
parseexception.h:11: error: expected class-name before ‘(’ token
parseexception.h:11: error: expected ‘{’ before ‘(’ token
enter code here

У меня уже была эта проблема, и яне могу понять, что с ним не так: /

Ответы [ 3 ]

14 голосов
/ 27 августа 2011

Компилятор через свои сообщения об ошибках сообщает вам важные вещи. Если мы возьмем только первое сообщение (всегда полезно позаботиться о проблемах компиляции, начиная с первого возникшего):

parseexception.h:9: error: expected class-name before ‘{’ token

Он говорит вам о необходимости взглянуть на строку 9. В коде есть проблема непосредственно перед "{": имя класса неверно. Из этого вы можете сделать вывод, что компилятор может не знать, что такое std :: runtime_error. Это означает, что компилятор не находит «std :: runtime_error» в предоставленных вами заголовках. Затем вам нужно проверить, правильно ли вы добавили заголовки.

Быстрый поиск в справочной документации по C ++ скажет вам, что std :: runtime_error является частью заголовка <stdexcept>, а не <exception>. Это распространенная ошибка.

Вы просто должны добавить этот заголовок, и ошибка исчезла. Из других сообщений об ошибках компилятор сообщает вам примерно то же самое, но в конструкторах.

Умение читать сообщения об ошибках компилятора является очень важным навыком, чтобы избежать блокирования при проблемах компиляции.

6 голосов
/ 27 августа 2011

включают <stdexcept>.

1 голос
/ 27 августа 2011

Вам необходимо иметь полное определение std::runtime_error, доступное в точке, из которой вы его производите.

#include <stdexcept>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...