期望这段代码编译和工作
template<class T>
class Base
{
virtual void method() = 0;
};
template<>
void Base<int>::method() { std::cout << "overrided" << std::endl; }
Base<int> base;
但它会出现'Base<int>': cannot instantiate abstract class
错误。思想部分特化会使Base<int>
非抽象并允许实例化它。
是否有一个像这个一样简短的工作解决方案,并使Base
类保持抽象?否则我可以使Base
类非抽象或从这里使用Nicol Bolas的解决方案:Template specialization and inheritance
答案 0 :(得分:4)
如果它不适用于非模板类,为什么它适用于模板类?
#include<iostream>
class Base
{
virtual void method() = 0;
};
void Base::method() { std::cout << "overrided" << std::endl; }
Base base;
错误:
10 : error: cannot declare variable 'base' to be of abstract type 'Base'
Base base;
^
3 : note: because the following virtual functions are pure within 'Base':
class Base
^
8 : note: virtual void Base::method()
void Base::method() { std::cout << "overrided" << std::endl; }
^
Compilation failed
答案 1 :(得分:2)
整个班级的专业化(而不仅仅是一个成员函数):
template<class T>
struct TempClass
{
virtual void f() = 0;
};
template <>
struct TempClass<int>
{
virtual void f()
{
//...
}
};
请注意,TempClass<int>
不再是抽象类,但其他Base
类仍然是抽象类,(TempClass<float>
,TempClass<double>
,{ {1}},TempClass<SomeClassType>
)。
和
它不会包含泛型类...
包含的字段。您必须从通用Base 或复制粘贴它们,这是更聪明的解决方案,
您将使用两个专业化的字段创建基类,然后使这些模板类继承自该基类:
TempClass
这样就不需要难看的复制粘贴了。
答案 2 :(得分:0)
可以在类中提供纯虚函数的实现。这不会使类可实现。
class Base
{
virtual void method() = 0;
};
void Base::method() { /* Do something */ }
// This is still a problem since Base
// is still an abstract class, i.e. it is not still not
// instantiable.
Base base;