c++ - 在基类中使用派生类的 typedef

标签 c++ templates typename

我希望派生类成为模板类的后代。该类取决于后代的成员。 简而言之,我希望这段代码能够编译:

struct IBootParams
{
    virtual bool GetImmediate() = 0;
};

template <class T>
struct TBootBootParams
{
    typename T::TransType transferType;

    typename T::UseAbort_ useAbort;

    bool GetImmediate()
    {
        if ( transferType == T::e1 )
        {
            return useAbort.someFlag;
        }

        return false;
    }

};

struct BootBootParams : public TBootBootParams<BootBootParams> 
{
    enum SomeEnum
    {
        e1=0,
        e2,
        e3
    };

    struct UseAbort
    {
        bool        someFlag;           

        char        someMember;             
        int         otherMember;        
    } useAbort;

    typedef SomeEnum TransType;
    typedef UseAbort UseAbort_;
};

struct BootAltBootParams : public TBootBootParams<BootAltBootParams> 
{
    enum SomeEnum
    {
        e1=5,
        e2,
        e3
    };

    struct UseAbort
    {
        bool        someFlag;           

        long long       someMember;             
        long long       otherMember;        
    } useAbort;

    typedef SomeEnum TransType;
    typedef UseAbort UseAbort_;
};

int _tmain(int argc, _TCHAR* argv[])
{
    BootBootParams bp;
    BootAltBootParams bpa;

    bool f = bp.GetImmediate();
    f = bpa.GetImmediate();
}

最佳答案

你不能这样做。当编译器实例化 TBootBootParams<BootBootParams>它还没有完全读取 BootBootParams 的完整定义,因此您无法从 TBootBootParams 定义内部访问其成员(TBootBootParams 的成员函数是一个异常(exception),因为它们稍后会实例化)。

通常的解决方案是有一个特征类:

template<class T> struct TBootBootParams_traits;

template <class T>
struct TBootBootParams
{
    typename TBootBootParams_traits<T>::TransType transferType;

    typename TBootBootParams_traits<T>::UseAbort_ useAbort;

    bool GetImmediate()
    {
        if ( transferType == TBootBootParams_traits<T>::e1 )
        {
            return useAbort.someFlag;
        }

        return false;
    }

};

struct BootBootParams;
template<> struct TBootBootParams_traits<BootBootParams>
{
    enum SomeEnum
    {
        e1=5,
        e2,
        e3
    };

    struct UseAbort
    {
        bool        someFlag;           

        long long       someMember;             
        long long       otherMember;        
    };

    typedef SomeEnum TransType;
    typedef UseAbort UseAbort_;
};

struct BootBootParams : 
    public TBootBootParams<BootBootParams>, 
    public TBootBootParams_traits<BootBootParams>
{
    UseAbort_ useAbort;
};

关于c++ - 在基类中使用派生类的 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479871/

相关文章:

c++ - SDL 图像的问题

c++ - 编译 C++ 代码时出现 ios::nocreate 错误

c++ - 如何在 CmakeList 中导入 Qtquickcontrol

c++ - 确定升压变体中的最大 sizeof()

c++ - Clang 与 MSVC : Treatment of template function prototypes

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 需要帮助 : "IntelliSense: data member initializer is not allowed"

c++ - cpp 文件中的模板特化实现导致模板 ID 不匹配错误

c++ - 为什么我们需要类型名称依赖于 C++ 中的模板参数

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?