2011-08-27 40 views
6

Tôi đang cố gắng để biên dịch này với g ++ dưới Ubuntu:biên dịch báo lỗi khi cố gắng để kế thừa từ std :: runtime_error

#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 

tôi nhận được lỗi thông điệp:

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 

Tôi có đã gặp vấn đề này đôi khi và tôi không thể thực sự hiểu sai điều gì với nó:/

Trả lời

14

Trình biên dịch thông qua các thông báo lỗi cho bạn biết những điều quan trọng. Nếu chúng ta lấy chỉ là thông điệp đầu tiên (nó luôn luôn là một điều tốt để chăm sóc các vấn đề biên soạn từng người một, bắt đầu bằng việc lần đầu tiên xảy ra):

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

Nó sẽ cho bạn biết nhìn vào dòng 9. Có sự cố trong mã ngay trước "{": tên lớp không hợp lệ. Bạn có thể suy ra từ điều này mà trình biên dịch có thể không biết "std :: runtime_error" là gì. Điều này có nghĩa rằng trình biên dịch không tìm thấy "std :: runtime_error" trong các tiêu đề bạn cung cấp. Sau đó, bạn phải kiểm tra xem bạn đã bao gồm các tiêu đề chính xác chưa.

Tìm kiếm nhanh trong tài liệu tham chiếu C++ sẽ cho bạn biết rằng std :: runtime_error là một phần của tiêu đề <stdexcept>, không phải là <exception>. Đó là một sai lầm phổ biến.

Bạn chỉ cần thêm tiêu đề này và lỗi đã biến mất. Từ các thông báo lỗi khác, trình biên dịch chỉ cho bạn biết về những điều tương tự, nhưng trong các hàm tạo.

Học cách đọc các thông báo lỗi của trình biên dịch là một kỹ năng rất quan trọng để tránh bị chặn trên các vấn đề biên dịch.

+0

cảm ơn rất nhiều Nikko: D – SlimJim

+0

+1 cho lời khuyên của người cha :) – Chani

6

bao gồm <stdexcept>.

+0

Chúng tôi đang chỉnh sửa chữ ký của bạn. Cũng có thể dừng viết nó. Hãy cứu chúng tôi một số rắc rối. _That_ sẽ lịch sự. :-) –

+0

@Tomalak: SO có rất nhiều người dùng trẻ con, tôi không quan tâm đến phần cá nhân của điều đó, chỉ có điều đó là buồn trong bức tranh toàn cầu. –

+0

Trẻ con ngoan cố từ chối chấp nhận ý kiến ​​phổ biến. :( –

1

Bạn cần có định nghĩa đầy đủ của std::runtime_error có sẵn tại thời điểm bạn lấy được từ nó.

#include <stdexcept> 
Các vấn đề liên quan