class HogeError : public exception {
 std::string str;
public:
 explicit HogeError(const std::string& s) : str(s) {}
 virtual const char *what() const { return str.data(); }
};

これだけで良いじゃないか。
そーいや、what()の戻り値ってc_str()じゃなくてdata()なんだよね。