为什么会发生这种编译器错误?

时间:2015-08-30 21:13:10

标签: c++ exception compiler-errors private mingw32

我正在处理用C ++编写的软件的异常处理。我遇到编译器错误(使用g ++(GCC)4.8.1 / mingw32)我不明白,这是一个最小的例子:

#include <iostream>
#include <exception>

class Bad_Img_Load: public std::exception {
    //public:
    virtual const char* what() const throw(){
        return "An image could not be loaded.";
    }
};

int main () {
    try{
        throw Bad_Img_Load();
    }catch (Bad_Img_Load& e){
        std::cout << e.what() << '\n';
    }
    return 0;
}

错误是:

a.cpp: In function 'int main()':
a.cpp:6:22: error: 'virtual const char* Bad_Img_Load::what() const' is private
  virtual const char* what() const throw(){
                      ^
a.cpp:15:25: error: within this context
     std::cout << e.what() << '\n';
                         ^

请注意,如果我取消注释该行&#39; public:&#39;然后它工作得很好。但是班级例外&#39;它继承的内容将所有内容定义为公共内容。所以我不明白为什么会出现这种错误。

2 个答案:

答案 0 :(得分:1)

基本上有一件事使structclass不同,这是默认的可见性。对于struct,默认值为public,而对于class,默认值为private

有人告诉您class默认public可见性是错误的。任何初学者教科书都会告诉你同样的事情。

答案 1 :(得分:1)

您继承的班级是否公开所有成员都无关紧要。如果你重载了一个继承的类&#39;公共函数与(在您的代码中隐式指定)私有访问说明符,然后重载是私有的。从技术上讲,您可以说您也在重载访问说明符。