gpt4 book ai didi

c++ - 无法将参数 1 从 'Component *' 转换为 'Component *'

转载 作者:行者123 更新时间:2023-11-27 22:50:25 25 4
gpt4 key购买 nike

我创建了一个小示例来演示该问题。我肯定不明白这里出了什么问题。使用 Visual Studio 2010。

这些类(非常松散地)以 MFC 为模型,因为这是我需要使用它的目的。基本上我想创建一个面板类,它可以包含其他面板或控件,所以我添加了一个组件类来跟踪 id 和父级,以及充当其组件容器的面板类。

现在我不明白的是为什么我会得到这个编译器错误,以及为什么我只在使用控件而不是子面板时得到它。

#include <iostream>
#include <algorithm>
#include <vector>

class CWnd
{
public:
CWnd(CWnd *pParent = NULL, int nId = -1)
{
mId = nId;
mParent = pParent;
mClassname = NULL;
}

void setId(int nId) { mId = nId; }
int getId(void) const { return mId; }

void setParent(CWnd *pParent) { mParent = pParent; }
CWnd *getParent(void) const { return mParent; }

bool create(const char *pClassname, int nId, CWnd *pParent)
{
mId = nId;
mParent = pParent;
mClassname = pClassname;

return true;
}

private:
int mId;
CWnd *mParent;
const char *mClassname;
};

class Ctrl : public CWnd
{
public:
Ctrl(CWnd *pParent, int nId = -1)
: CWnd(pParent, nId)
{
}
};

class Dialog : public CWnd
{
public:
Dialog(CWnd *pParent, int nId = -1)
: CWnd(pParent, nId)
{
}

bool create(int nId, CWnd *pParent)
{
CWnd::create("dialog", nId, pParent);

return true;
}
};

class View : public CWnd
{
public:
View(CWnd *pParent = NULL)
: CWnd(pParent)
{
}
};

template <typename W>
class Component : public W
{
public:
Component(CWnd *pParent = NULL)
: W(pParent)
{
mId = -1;
mParent = pParent;
}

virtual bool create(CWnd *pParent = NULL)
{
if(pParent)
mParent = pParent;

W::setParent(mParent);
W::setId(mId);

return true;
}

private:
int mId;
CWnd *mParent;
};

class Panel : public Component<Dialog>
{
public:
Panel(CWnd *pParent = NULL)
: Component(pParent)
{
}

virtual bool create(CWnd *pParent = NULL)
{
if(pParent != NULL)
setParent(pParent);

Dialog::create(getId(), pParent);

for(Components::iterator it = mComponents.begin(); it != mComponents.end(); ++it)
{
if(!(*it)->create(this))
return false;
}

return true;
}

void addComponent(Component *pComponent)
{
if(std::find(mComponents.begin(), mComponents.end(), pComponent) == mComponents.end())
mComponents.push_back(pComponent);
}

void removeComponent(Component *pComponent)
{
Components::iterator pos = std::find(mComponents.begin(), mComponents.end(), pComponent);
if(pos != mComponents.end())
mComponents.erase(pos);
}

protected:
typedef std::vector<Component *> Components;

private:
Components mComponents;
};

int main()
{
View v;
Panel d;
Panel p;
Component<Ctrl> listbox;
Component<Ctrl> tab;

// these are generating the error
d.addComponent(&listbox);
d.addComponent(&tab);

// only this one works.
d.addComponent(&p);

std::cout << "\nDone! Press any key..." << std::endl;
std::cin.ignore();

return 0;
}

我得到的错误信息是:

'Panel::addComponent' : cannot convert parameter 1 from 'Component<W> *' to 'Component<W> *'

最佳答案

没有类型 Component , 所以没有类型 Component* .但是,在 Panel 的上下文中类,因为它派生自 Component<Dialog> , 名字 Component实际上是注入(inject)的,指的是Component<Dialog> .所以 addComponent 的正确签名是:

void addComponent(Component<Dialog> *pComponent)

但是Component<Ctrl>不源自 Component<Dialog> , 所以 Component<Ctrl>*不能传递给这个函数。

您可能想要做的是导出 Component来自第二个基类(不是派生自任何东西)。

class Component_base
{
// component common functionality
};

template<typename W>
class Component : public W, public Component_base
{
...
};

然后是你的Panel类可以存储:

std::vector<Component_base*> Components;

关于c++ - 无法将参数 1 从 'Component<W> *' 转换为 'Component<W> *',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37644281/

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