摘要 class 存在模板函数问题
Abstract class with template function issue
我有一个摘要struct I
,方法a
。 B
和 B2
将从它继承。 X
结构有一个 I
类型成员,将通过基于类型的 createInsance
模板方法实例化它。我想在 B2
上添加一个附加功能 b2Exclusive
,但我收到编译错误,它在 A
.
中不存在
error: ‘using element_type = struct B’ {aka ‘struct B’} has no member named ‘b2Exclusive’
有什么方法可以在不为 B
定义 b2Exclusive
的情况下解决这个问题并保持这种结构?
#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;
}
如果模板函数使用类型名称 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;
}
我有一个摘要struct I
,方法a
。 B
和 B2
将从它继承。 X
结构有一个 I
类型成员,将通过基于类型的 createInsance
模板方法实例化它。我想在 B2
上添加一个附加功能 b2Exclusive
,但我收到编译错误,它在 A
.
error: ‘using element_type = struct B’ {aka ‘struct B’} has no member named ‘b2Exclusive’
有什么方法可以在不为 B
定义 b2Exclusive
的情况下解决这个问题并保持这种结构?
#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;
}
如果模板函数使用类型名称 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;
}