代码之家  ›  专栏  ›  技术社区  ›  anon

G++:常量丢弃限定符

  •  8
  • anon  · 技术社区  · 14 年前

    为什么我会得到 discard qualifiers 错误:

    customExc.cpp: In member function ‘virtual const char* CustomException::what() const’:
    customExc.cpp: error: passing ‘const CustomException’ as ‘this’ argument of ‘char customException::code()’ discards qualifiers
    

    下面的代码示例

    #include <iostream>
    
    
    class CustomException: public std::exception {
    
    public:
    
        virtual const char* what() const throw() {
            static std::string msg;
            msg  = "Error: ";
            msg += code();  // <---------- this is the line with the compile error 
            return msg.c_str();
        }
    
        char code() { return 'F'; }
    };
    

    我之前在SOF上搜索过关于模拟器的问题。

    我已经添加了 const 在任何可能的地方。

    请告诉我-我不明白这一点…

    编辑 : 以下是在Ubuntu-Carmic-32位(G++v4.4.1)上复制的步骤

    1. 将示例另存为 customExc.cpp
    2. 类型 make customExc.o

    编辑 :错误与 CustomException 。班级 Foo 与此无关。所以我删除了它。

    4 回复  |  直到 14 年前
        1
  •  14
  •   Josh Kelley    14 年前

    CustomException::what 电话 CustomException::code . 客户例外::什么 是const方法,由const表示 之后 what() . 因为它是一个常量方法,所以它不能做任何可能修改自身的事情。 customException::代码 不是常量方法,这意味着它可以 承诺不修改自己。所以 客户例外::什么 不能打电话 customException::代码 .

    注意,const方法不一定与const实例相关。 Foo::bar 可以声明其 exc 变量为非常量并调用常量方法,如 客户例外::什么 这就意味着 客户例外::什么 承诺不修改 EXC ,但其他代码可能。

    C++常见问题有更多的信息 const methods .

        2
  •  4
  •   amit kumar    14 年前
       int code() const { return 42; }
    
        3
  •  3
  •   leiz    14 年前

    你的 what() 是常量成员函数,但 code() 不是。

    只是改变一下 代码() code() const .

        4
  •  3
  •   AnT stands with Russia    14 年前

    你的 code() 未声明成员函数 const . 从const成员函数调用非const成员函数( what() 在这种情况下)是非法的。

    让你的 代码() 成员常量

    推荐文章