[英]c++ autoconvert inherited class to base class
我有一類轉換為基類的問題。 這是代碼:
#define Derive_NTag_CRTP(Type) class Type: public NTagBase<Type>
template<typename Derived>
class NTagBase{
public:
NTagBase(var name) { this->_name = name; }
NTagBase(const NTagBase & ntag) { this->_name = ntag._name; }
NTagBase* append(NTagBase<Derived> *item) { _children.push_back(item); return this; }
private:
var _name;
vector<NTagBase *> _children;
};
Derive_NTag_CRTP(NTag){
public:
NTag(var name) : NTagBase(name) { }
NTag(const NTagBase & ntag) : NTagBase(ntag) { }
};
Derive_NTag_CRTP(NTagInput){
public:
NTagInput(var type) : NTagBase("input") { _type = type; }
NTagInput(const NTagBase & ntag) : NTagBase(ntag) { }
private:
var _type;
};
int main(int argc, char **argv, char **envv)
{
NTag div("div");
NTagInput button("button");
div.append(new NTag("span"));
div.append(&button);// Error 1 error C2664: 'NTagBase<Derived>::append': can not convert parameter 1 from 'NTagInput *' to 'NTagBase<Derived> *'
}
沒有一個明確的演員表,我該如何解決?
PS:我需要一個向量基類的指針,並將其附加到繼承的所有種類的類中。
div
是NTag
,即NTagBase<NTag>
。 button
是NTagInput
,即NTagBase<NTagInput>
,而div
的append()
需要一個不相關的NTagBase<NTag>
。 您應該更改append
到類似
template <typename D>
NTagBase* append(NTagBase<D> item) { ... }
但是,您仍然不能在單個向量中存儲不同類型的項目。 最好做一個非模板如Base
的NTagBase
,讓您的載體包含指針(或std::unique_ptr
)到Base
。
div.append (...)
顯然需要重載,因為從基類繼承后,它將無法理解第二個簽名,即div.append(&button);
或者,您也可以創建一個包裝器類,將每個對象類型打包到其自己的定義中,並提供一種將其轉換回原始類型的機制。
另外,只要重載任何必要的功能即可。
class NTagInput;
class AppendInputRegister;
template<typename Derived>
class NTagBase{
public:
NTagBase(string name) { this->_name = name; }
NTagBase(const NTagBase & ntag) { this->_name = ntag._name; }
NTagBase* append(NTagBase<Derived> *item) {
_children.push_back((NTagBase *)item);
return this;
}
private:
string _name;
vector<NTagBase *> _children;
};
class NTag: public NTagBase<NTag>{
public:
NTag(string name) : NTagBase(name) { }
NTag(const NTagBase & ntag) : NTagBase(ntag) { }
NTagBase* append(NTagBase<NTagInput> *item) {
append((NTagBase<NTag> *)item);
}
NTagBase* append(NTagBase<NTag> *item) {
NTagBase::append((NTagBase<NTag> *)item);
}
};
class NTagInput: public NTagBase<NTagInput>{
public:
NTagInput(string type) : NTagBase("input") { _type = type; }
NTagInput(const NTagBase & ntag) : NTagBase(ntag) { }
private:
string _type;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.