2013-05-13 29 views
8

Ví dụ:Làm thế nào để kế thừa từ std :: runtime_error?

#include <stdexcept> 
class A { }; 
class err : public A, public std::runtime_error("") { }; 
int main() { 
    err x; 
    return 0; 
} 

Với ("") sau runtime_error tôi nhận được:

error: expected '{' before '(' token 
error: expected unqualified-id before string constant 
error: expected ')' before string constant 

khác (không ("")) tôi nhận được

In constructor 'err::err()': 
error: no matching function for call to 'std::runtime_error::runtime_error()' 

gì đang xảy ra vậy?

(Bạn có thể kiểm tra nó ở đây: http://www.compileonline.com/compile_cpp_online.php)

Trả lời

13

Đây là cú pháp chính xác:

class err : public A, public std::runtime_error 

Và không:

class err : public A, public std::runtime_error("") 

Khi bạn đang làm ở trên. Nếu bạn muốn vượt qua một chuỗi rỗng để các nhà xây dựng của std::runtime_error, làm theo cách này:

class err : public A, public std::runtime_error 
{ 
public: 
    err() : std::runtime_error("") { } 
//  ^^^^^^^^^^^^^^^^^^^^^^^^ 
}; 

Đây là một live example để hiển thị các biên dịch mã.

+1

Tôi đã thử nó trên http://www.compileonline.com/compile_cpp_online.php và đề xuất của bạn cung cấp cho tôi 'không có hàm phù hợp để gọi tới 'std :: runtime_error :: runtime_error()'' – mchen

+0

@MiloChen: bạn chắc chắn bạn đã sao chép mọi thứ chính xác chưa? Tôi đã thêm một liên kết đến một ví dụ trực tiếp cho thấy mã biên dịch chính xác –

+1

Ồ, tôi hiểu, nó sẽ không biên dịch nếu tôi bỏ lỡ hàm tạo 'err(): std :: runtime_error (" ") {}'. Nó không phải là tôi * muốn * để vượt qua một chuỗi rỗng - Tôi * buộc *. – mchen

Các vấn đề liên quan