C++ 驱动类和模板参数

C++ 驱动类和模板参数,c++,templates,inheritance,C++,Templates,Inheritance,很抱歉标题含糊不清 我试图修复一个相当大的代码库中的问题。该修复程序要求我将ChildClass和childlistlementclass作为模板参数与另一个一起提供。我相信我遇到的问题是parentlistlementclass中的myType没有被typedef ChildClass myType覆盖。 我怎样才能做到这一点?多谢各位 编译器说: Error 1 error C2664: 'void ParentListElementClass<ChildClass>::

很抱歉标题含糊不清

我试图修复一个相当大的代码库中的问题。该修复程序要求我将
ChildClass
childlistlementclass
作为模板参数与另一个一起提供。我相信我遇到的问题是
parentlistlementclass
中的
myType
没有被
typedef ChildClass myType覆盖ChildListElementClass
中的code>。 我怎样才能做到这一点?多谢各位

编译器说:

Error   1   error C2664: 'void ParentListElementClass<ChildClass>::AddX(ParentClass<ParentListElementClass<ChildClass>> *)' : cannot convert argument 1 from 'ParentClass<ChildListElementClass> *const ' to 'ParentClass<ParentListElementClass<ChildClass>> *'
编辑:在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>{};
模板类ParentListClass;
模板
类ParentElementClass
{
typedef ParentListClass myType;
};
模板
类ParentListClass{};
类ChildListClass;
类ChildElementClass:公共ParentElementClass{};
类ChildListClass:PublicParentListClass{};

我不确定我是否完全理解您的问题,但不管我怎么想,更改ParentListentClass似乎很难避免。你可以在这方面试试

template<typename T, typename U>
struct MyTypedefCase
{
    typedef T<U> _type;
};
模板
结构MyTypedefCase
{
类型定义T_类型;
};
然后将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
};
模板
类ParentListElementClass
{
//typedef ParentClass myType;将其更改为第行下方
typedef typename MyTypedefCase::u type myType;
//代码的其余部分
};

class ChildListElementClass:公共ParentListElementClass

我从来没有用模板做过这么复杂的事情,所以我不保证它会工作,但是如果我必须用最小的改动来做的话,这就是方法。也许有人可以研究一下这个解决方案,并提供一些更改或改进。

非常感谢。如果这一切顺利,我会同意的。我很感兴趣是否有一个改动较少的解决方案,因为我希望尽可能少地干扰原始的代码库。这种方式不太有效,因为
MyTypedefCase
中的模板参数
T
需要它自己的模板列表才能使
typedef T\u type
起作用。不过,我稍微修改了您的代码,以便所有类都将自己作为模板参数
template
,现在它确实可以工作了。再次感谢你。
int _tmain(int argc, _TCHAR* argv[])
{
    ChildClass Child;
    ChildListElementClass ChildListElement;
    Child.DoSomething();
    return 0;
}
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>{};
template<typename T, typename U>
struct MyTypedefCase
{
    typedef T<U> _type;
};
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>