使用 g++ 4.2.1 编译此代码:
struct S { };
template<typename T> struct ST { };
template<typename BaseType>
class ref_count : private BaseType { };
template<typename RefCountType>
class rep_base : public RefCountType { };
class wrap_rep : public rep_base<ref_count<S> > {
typedef rep_base<ref_count<S> > base_type; // line 11
};
我得到:
bug.cpp:1: error: ‘struct S’ is inaccessible
bug.cpp:11: error: within this context
但是,如果我将wrap_rep
类更改为使用ST
:
class wrap_rep : public rep_base<ref_count< ST<int> > > {
typedef rep_base<ref_count< ST<int> > > base_type;
};
它编译得很好。或者,如果我将原始代码更改为:
class wrap_rep : public rep_base<ref_count<S> > {
typedef rep_base<ref_count< ::S > > base_type; // now using ::
};
它也编译得很好。对我来说,原始代码看起来很好。这是一个 g++ 错误吗?如果不是,那为什么使用模板有效?而且,对于另一种情况,为什么有::S
必要?