mógłby ktoś wytłumaczyć mi, dlaczego ten kod:Weird błąd kompilatora i szablon dziedziczenie
class safe_bool_base
{ //13
protected:
typedef void (safe_bool_base::*bool_type)() const;
void this_type_does_not_support_comparisons() const {} //18
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::this_type_does_not_support_comparisons : 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::this_type_does_not_support_comparisons : 0; //46
}
protected:
virtual bool boolean_test() const = 0;
virtual ~safe_bool() {}
};
Wytwarza się następujący błąd kompilatora?
c:\project\include\safe_bool.hpp(46) : error C2248: 'safe_bool_base::this_type_does_not_support_comparisons' : cannot access protected member declared in class 'safe_bool_base'
c:\project\include\safe_bool.hpp(18) : see declaration of 'safe_bool_base::this_type_does_not_support_comparisons'
c:\project\include\safe_bool.hpp(13) : see declaration of 'safe_bool_base'
Ponieważ obie safe_bool
szablony pochodzą z safe_bool_base
, ja nie rozumiem, dlaczego nie można uzyskać dostęp do chronionego członka klasy bazowej.
Czy brakuje mi czegoś?
To jest dobre pytanie. Sugerujemy dodanie tagu "protected", "base", "deriv" oraz pytanie, które będzie pojawiać się w zapytaniach/odnośnikach. – Chubsdad
@Chubsdad: Dzięki. Mogę dodać tylko jeszcze jeden tag. (5 to maksymalna liczba tagów afaik.) – ereOn