【发布时间】:2010-09-07 09:41:25
【问题描述】:
谁能解释一下为什么这个代码:
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() {}
};
产生以下编译器错误?
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'
由于两个safe_bool 模板都派生自safe_bool_base,我不明白为什么不能访问基类的受保护成员。
我错过了什么吗?
【问题讨论】:
-
这是个好问题。建议您在问题中添加标签“受保护”、“基础”、“派生”,以便在搜索/参考中出现
-
@Chubsdad:谢谢。我只能再添加一个标签。 (5 是 afaik 的最大标签数。)
标签: c++ templates protected derived safe-bool-idiom