抽象类与模板函数的问题



我有一个方法a的抽象struct IBB2将继承它。X结构体有一个I类型成员,并将通过基于类型的createInsance模板方法实例化它。我想在B2上有一个额外的功能b2Exclusive,但我得到了编译错误,它不存在于A

错误:' using element_type = struct B '{也称为' struct B '}没有名为' b2Exclusive '的成员

有没有办法解决这个问题,而不定义b2ExclusiveB以及保持这种方式的结构?

#include <iostream>
#include <memory>
using namespace std;
struct I
{
virtual void a() = 0;
};
struct B : public I 
{   
B()
{
std::cout<<"Bn";
}
void a()
{
std::cout<<"-a from Bn";
}
};
struct B2 : public I
{ 
B2()
{
std::cout<<"B2n";
}
void a()
{
std::cout<<"-a from B2n";
}
void b2Exclusive()
{
std::cout<<"-something for B2n";
}
};
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;
}

如果模板函数使用typename 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;
}

最新更新