让我说我有:
class A:
{
public:
A();
virtual void foo();
};
class B:public A
{
public:
B();
void foo();
};
class C:public A
{
public:
C();
void foo();
};
并在主
if(is_abstract<A>::value==false)
{
int option;
cout<<"What type of object do you want to create? 0-A,1-B,2-C";
cin option;
if(option==0)
A *a = new A();
if(option==1)
B *b = new B();
else
C *c = new C();
}
else
{
int option;
cout<<"What type of object do you want to create? 1-B,2-C";
cin option;
if(option==1)
B *b = new B();
else
C *c = new C();
}
在当前状态下,代码可以正常工作。如果我使虚拟void foo()= 0,A变成抽象类,我得到编译时错误,因为我无法在A * a = new A()实例化抽象类。有没有办法绕过这个编译时错误?感谢
答案 0 :(得分:2)
在当前形式中,将生成尝试实例化A的代码(尽管从未调用过)。即使编译器由于优化而不会生成代码,非生成的代码仍然必须是有效的,而你的代码不是。
要解决此问题,您必须使用某种形式的SFINAE来确保从未生成尝试实例化A的代码。像这样:
void make(std::enable_if_t<std::is_abstract<A>::value>* = nullptr) {
... (the code which never creates A)
}
void make(std::enable_if_t<!std::is_abstract<A>::value>* = nullptr) {
... (the code which does create A)
}
...
make();