どのコンパイラでもコンパイルできないようです。明らかsafe_bool
に、保護されたメソッドのアドレスをそのベースで返すことはできません。public メソッドを追加してsafe_bool_base
、そのアドレスを返す必要があります。
また、非依存構造を使用して演算子==
とが無効になっているようです (インスタンス化されていなくてもエラーが発生する可能性があります)。!=
おそらくこれで問題が解決します:
class safe_bool_base {
protected:
typedef void (safe_bool_base::*bool_type)() const;
private:
void cannot_compare_boolean_results() const {}
public:
void public_func() const {}
protected:
safe_bool_base() {}
safe_bool_base(const safe_bool_base&) {}
safe_bool_base& operator=(const safe_bool_base&) {return *this;}
~safe_bool_base() {}
};
template <typename T=void> class safe_bool : public safe_bool_base {
public:
operator bool_type() const {
return (static_cast<const T*>(this))->boolean_test()
? &safe_bool_base::public_func : 0;
}
protected:
~safe_bool() {}
};
template<> class safe_bool<void> : public safe_bool_base {
public:
operator bool_type() const {
return boolean_test()==true ?
&safe_bool_base::public_func : 0;
}
protected:
virtual bool boolean_test() const=0;
virtual ~safe_bool() {}
};
template <typename T, typename U>
bool operator==(const safe_bool<T>& lhs,const safe_bool<U>& rhs) {
lhs.cannot_compare_boolean_results(); //call private method to produce error
return false;
}
template <typename T,typename U>
bool operator!=(const safe_bool<T>& lhs,const safe_bool<U>& rhs) {
lhs.cannot_compare_boolean_results(); //call private method to produce error
return false;
}