对于模糊的标题感到抱歉。
我试图在相当大的代码库中解决问题。该修复程序要求我将ChildClass
和ChildListElementClass
作为模板参数提供给另一个。我相信我遇到的问题是,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>{};
答案 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>
我从来没有用模板做过这么复杂的事情所以我不保证它会起作用,但如果我不得不以最小的改变去做,那就是这样。也许有人可以调查这个解决方案并提供改变或改进。