首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:使用CRTP,派生类中定义的类在基类中不可访问。

C++:使用CRTP,派生类中定义的类在基类中不可访问。
EN

Stack Overflow用户
提问于 2011-04-04 05:06:09
回答 1查看 1.7K关注 0票数 7

下面是(简化的)基类:

代码语言:javascript
复制
template <class T>
class SharedObject
{
protected:
    QExplicitlySharedDataPointer <typename T::Data> d;
};

以下是推导出来的:

代码语言:javascript
复制
class ThisWontCompile : public SharedObject <ThisWontCompile>
{
private:
    friend class SharedObject;
    struct Data : public QSharedData
    {
        int id;
    };
};

有什么办法可以从ThisWontCompile::Data SharedObject访问SharedObject吗?对于来自基对象的派生对象,究竟可以做什么,不能做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-04 05:15:55

这实际上与可访问性和友谊无关,而是与CRTP的使用有关。考虑下面的例子,它也显示了这个问题:

代码语言:javascript
复制
template <class T>
struct Base
{
    typedef typename T::Data Data;
};

struct ThisWontCompile : public Base<ThisWontCompile>
{
    struct Data { };
};

问题是,ThisWontCompile在用作Base的模板参数时是不完整的,因此只能作为Base中的不完整类型使用。

关于您的特定问题的几个解决方案,请参阅this other question的答案,特别是Martin建议使用一个特性类,它基本上如下所示:

代码语言:javascript
复制
// 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类使用部分专门化。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5534759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档