我可以重写并使用中模板类型的子类作为超级类吗

Can I override and use a subclass for the template type in as the super class

本文关键字:子类 类型 重写 我可以      更新时间:2023-10-16

我可以重写并使用中模板类型的子类作为超级类吗。

我是一名Java程序员,这与泛型配合得很好,但我不熟悉如何在C++中做很多事情

我能用吗

template <typename T>
class A{
public:
    T get(){
        return t;
    }
    A(){
    }
    void set(T tt){
        t=tt;
    }
private: 
    T t;
};

并用类似的东西扩展它

class B:A<B> 

其中子类B用作类A的泛型类型,而类B不需要泛型

原则上,您对模板的使用被称为"奇怪的重复模板模式"(CRTP),并且完全有效。

然而,请注意,Java泛型和C++模板在很多方面都有很大的不同,包括在A中使用B的限制。派生的CRTP类在模板实例化时是不完整的,因此您不能像以前那样在基类中分配它们中的任何对象。这就是代码不编译的原因。通常的方法是强制转换访问器方法,如:

 void set(T tt){
    static_cast<T&>(*this)=tt;
 }

是:http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern