下面是(简化的)基类:
template <class T>
class SharedObject
{
protected:
QExplicitlySharedDataPointer <typename T::Data> d;
};以下是推导出来的:
class ThisWontCompile : public SharedObject <ThisWontCompile>
{
private:
friend class SharedObject;
struct Data : public QSharedData
{
int id;
};
};有什么办法可以从ThisWontCompile::Data SharedObject访问SharedObject吗?对于来自基对象的派生对象,究竟可以做什么,不能做什么?
发布于 2011-04-04 05:15:55
这实际上与可访问性和友谊无关,而是与CRTP的使用有关。考虑下面的例子,它也显示了这个问题:
template <class T>
struct Base
{
typedef typename T::Data Data;
};
struct ThisWontCompile : public Base<ThisWontCompile>
{
struct Data { };
};问题是,ThisWontCompile在用作Base的模板参数时是不完整的,因此只能作为Base中的不完整类型使用。
关于您的特定问题的几个解决方案,请参阅this other question的答案,特别是Martin建议使用一个特性类,它基本上如下所示:
// Base
template <typename T>
struct BaseTraits;
template <typename T>
struct Base
{
typedef typename BaseTraits<T>::Data Data;
};
// Derived
struct Derived;
template <>
struct BaseTraits<Derived>
{
struct Data { };
};
struct Derived : public Base<Derived>
{
};typename BaseTraits<Derived>::Data既可以用于Derived,也可以用于Base。如果Derived本身是一个模板,则可以对class类使用部分专门化。
https://stackoverflow.com/questions/5534759
复制相似问题