Reputation: 65
I want to define an exception which returns int. My code is given below. It's showing error.
class BadLengthException : public exception {
public:
int x;
BadLengthException(int n){
x =n;
}
virtual const int what() const throw () {
return x;
}
};
The error is:
solution.cc:12:22: error: conflicting return type specified for ‘virtual const int BadLengthException::what() const’ virtual const int what() const throw () { ^~~~ In file included from /usr/include/c++/7/exception:38:0, from /usr/include/c++/7/ios:39, from /usr/include/c++/7/ostream:38, from /usr/include/c++/7/iostream:39, from solution.cc:1: /usr/include/c++/7/bits/exception.h:69:5: error: overriding ‘virtual const char* std::exception::what() const’ what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;
Upvotes: 6
Views: 2354
Reputation: 89
Hey I think you are doing the inherited code on hackerrank, I faced the same issue, also we can't change the other part of the code, so we have to override the what function,
For your C++ 11:
Now we have our int n, but we must convert it to char* to return it,
first convert it to a string with to_string() then make that a const shar* (aka c string) using .c_str()
Our class now becomes:
class BadLengthException : public exception{
public:
string str;
BadLengthException(int n){
str = to_string(n);
}
const char * what () const throw() {
return str.c_str() ;
}
};
Upvotes: 3
Reputation: 598434
exception::what()
returns a const char*
, you can't change that. But you can define another method to return the int
, eg:
class BadLengthException : public std::length_error {
private:
int x;
public:
BadLengthException(int n) : std::length_error("bad length"), x(n) { }
int getLength() const { return x; }
};
And then call it in your catch
statements, eg:
catch (const BadLengthException &e) {
int length = e.getLength();
...
}
Upvotes: 7