【问题标题】:Why is this compiler error happening?为什么会发生此编译器错误?
【发布时间】:2015-08-30 21:13:10
【问题描述】:

我正在为我用 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';
                         ^

请注意,如果我取消注释“public:”行,那么它就可以正常工作。但是它继承的类“异常”将所有内容都定义为公共的。所以我完全不明白为什么会出现这个错误。

【问题讨论】:

  • 如果你声明它是私有的,为什么你期望被覆盖的函数是公共的?
  • @Kenji:不,他们不这样做。我没有在链接中看到它。在您的链接中,他们总是将异常捕获为 std::exception &amp;e,这就是他们可以访问 public e.what() 的原因。他们从不将异常捕获为用户定义的类型。您将异常捕获为Bad_Img_Load&amp; e,这是一个完全不同的故事。
  • 你说得对,AnT,我刚刚注意到了。现在我懂了。我不知道为什么这让我如此困惑。

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


【解决方案1】:

您继承的类是否所有成员都公开并不重要。如果您使用(在您的代码中隐式指定的)私有访问说明符重载继承类的公共函数,则重载是私有的。从技术上讲,您可以说您也重载了访问说明符。

【讨论】:

    【解决方案2】:

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

    谁告诉你class 有默认的public 可见性是错误的。任何初学者教科书都会告诉你。

    【讨论】:

    • 是的,你是对的,我犯了一个错误。我想写它应该从它的超类继承公共。
    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2023-03-22
    • 2023-03-30
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多