[英]Template specialization of pure virtual method
希望此代碼可以編譯和工作
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的解決方案: 模板專門化和繼承
如果它不適用於非模板類,為什么還要對模板類使用?
#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
整個類的專業化(而不只是一個成員函數):
template<class T>
struct TempClass
{
virtual void f() = 0;
};
template <>
struct TempClass<int>
{
virtual void f()
{
//...
}
};
請注意, TempClass<int>
不再是抽象類 ,但其他Base
類仍然是抽象類( TempClass<float>
, TempClass<double>
, TempClass<SomeClassType>
...
)。
和
它不會包含通用類TempClass
包含的字段。 您將不得不從通用Base 或中復制粘貼它們,這是更聰明的解決方案,
您將使用兩個專業化都具有的字段創建基類,然后使這些模板類從該基類繼承:
template <typename T>
struct Base
{
// some members that all Base classes have
};
template <typename T>
struct TempClass: Base<T>
{
virtual void f() = 0;
};
template <>
struct TempClass<int>: Base<int>
{
virtual void f()
{
//...
}
};
這樣就不需要丑陋的復制粘貼了。
可以在類中提供純虛函數的實現。 這不能使類實例化。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.