这是(简化的)基类:
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::数据 from 共享对象?对于从基础对象派生的对象到底能做什么、不能做什么?
这其实与可达性和友好性无关,而是与CRTP的使用有关。考虑以下也显示该问题的示例:
template <class T>
struct Base
{
typedef typename T::Data Data;
};
struct ThisWontCompile : public Base<ThisWontCompile>
{
struct Data { };
};
问题是ThisWontCompile
在用作模板参数时不完整Base
,因此只能用作不完整类型Base
.
如需针对您的具体问题的一些解决方案,请查阅以下问题的答案这另一个问题 https://stackoverflow.com/questions/652155/invalid-use-of-incomplete-type,特别是 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
and in Base
. If Derived
本身就是一个模板,您可以对特征类使用部分特化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)