派生类和模板参数

时间:2014-11-18 21:01:35

标签: c++ templates inheritance

对于模糊的标题感到抱歉。

我试图在相当大的代码库中解决问题。该修复程序要求我将ChildClassChildListElementClass作为模板参数提供给另一个。我相信我遇到的问题是,myType中的ParentListElementClass未被typedef ChildClass<ChildListElementClass> myType;在派生类ChildListElementClass中覆盖。 我怎样才能做到这一点?非常感谢你!

编译说:

Error   1   error C2664: 'void ParentListElementClass<ChildClass>::AddX(ParentClass<ParentListElementClass<ChildClass>> *)' : cannot convert argument 1 from 'ParentClass<ChildListElementClass> *const ' to 'ParentClass<ParentListElementClass<ChildClass>> *'

我编写了以下最小测试用例来演示我的问题:

#include "stdafx.h"
#include <iostream>

template <class ElementType>
class ParentClass;

template <class ParentType>
class ParentListElementClass
{
public:
    ParentListElementClass(){};
    ~ParentListElementClass(){};
    typedef ParentClass<ParentListElementClass> myType;
    myType *x;
    void AddX(myType *m){
        m->speak();
    };
};

class ChildListElementClass;

template <class ElementType>
class ParentClass
{
public:
    ParentClass(){};
    ~ParentClass(){};   
    ElementType m;
    void DoSomething() {
        std::cout << "ParentList\n";
        m.AddX(this);
    }
    virtual void speak(){ std::cout << "Parent\n";}
};

class ChildClass;

class ChildListElementClass : public ParentListElementClass<ChildClass>
{
public:
    ChildListElementClass(){};
    ~ChildListElementClass(){};
};


class ChildClass : public ParentClass<ChildListElementClass>
{
public:
    ChildClass(){};
    ~ChildClass(){};
    void speak(){ std::cout << "Child\n"; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    ChildClass Child;
    ChildListElementClass ChildListElement;
    Child.DoSomething();
    return 0;
}

在itachi的帮助下编辑:工作版:

template <typename ElementType, typename ListType> class ParentListClass;

template <typename ElementType, typename ListType>
class ParentElementClass
{
    typedef ParentListClass<ElementType, ListType> myType;
};

template <typename ElementType, typename ListType>
class ParentListClass{};

class ChildListClass;

class ChildElementClass : public ParentElementClass<ChildElementClass, ChildListClass>{};    

class ChildListClass : public ParentListClass<ChildElementClass, ChildListClass>{};

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你的问题,但不管我怎么想,改变ParentListElementClass似乎很难避免。你可以在这些方面尝试一些东西......

template<typename T, typename U>
struct MyTypedefCase
{
    typedef T<U> _type;
};

然后将ParentListElementClass重写为

template <class ParentType, typename T, typename U>
class ParentListElementClass
{
     //typedef ParentClass<ParentListElementClass> myType;     Change this to below line
     typedef typename MyTypedefCase<T,U>::_type myType;
     //Rest of your code
};

class ChildListElementClass : public ParentListElementClass<ChildClass,ChildClass,ChildListElementClass>

我从来没有用模板做过这么复杂的事情所以我不保证它会起作用,但如果我不得不以最小的改变去做,那就是这样。也许有人可以调查这个解决方案并提供改变或改进。