gpt4 book ai didi

c++ - 派生类和模板参数

转载 作者:行者123 更新时间:2023-11-28 06:34:17 25 4
gpt4 key购买 nike

抱歉标题模糊。

我试图解决一个相当大的代码库中的问题。修复需要我有 ChildClassChildListElementClass两者都作为模板参数与另一个一起提供。我相信我遇到的问题是 myTypeParentListElementClass未被 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>{};

最佳答案

我不确定我是否完全理解您的问题,但无论我怎么想,更改 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>

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

关于c++ - 派生类和模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27003953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com