我有一個struct I帶有方法的摘要a。B并將B2繼承它。Xstruct 有一個I型別成員,并將通過createInsance基于型別的模板方法實體化它。我想擁有B2一個額外的功能b2Exclusive,但我得到了編譯錯誤,它不存在于A.
錯誤:'使用 element_type = struct B' {aka 'struct B'} 沒有名為 'b2Exclusive' 的成員
有沒有什么方法可以解決這個問題而無需定義并保持這種結構b2Exclusive?B
#include <iostream>
#include <memory>
using namespace std;
struct I
{
virtual void a() = 0;
};
struct B : public I
{
B()
{
std::cout<<"B\n";
}
void a()
{
std::cout<<"-a from B\n";
}
};
struct B2 : public I
{
B2()
{
std::cout<<"B2\n";
}
void a()
{
std::cout<<"-a from B2\n";
}
void b2Exclusive()
{
std::cout<<"-something for B2\n";
}
};
using Iptr = std::shared_ptr<I>;
struct X
{
void createI()
{
if (type == "B")
{
createInstance<B>();
}
else
{
createInstance<B2>();
}
}
template <typename T>
void createInstance()
{
auto i = std::make_shared<T>();
if (type == "B2")
{
i->b2Exclusive();
}
}
std::string type = "None";
};
int main()
{
X x;
x.type = "B2";
x.createI();
return 0;
}
uj5u.com熱心網友回復:
如果模板函式使用型別名 B2,則只能呼叫 b2Exclusive:一種方法是為該型別創建特化,例如:
struct X
{
void createI();
template <typename T>
void createInstance()
{
//do something
}
std::string type = "None";
};
template<>
void X::createInstance<B2> ()
{
auto i = std::make_shared<B2>();
i->b2Exclusive();
}
void X::createI()
{
if (type == "B")
{
createInstance<B>();
}
else
{
createInstance<B2>();
}
}
int main()
{
X x;
x.type = "B2";
x.createI();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481088.html
下一篇:從父類python覆寫“常量”
