代码之家  ›  专栏  ›  技术社区  ›  The Quantum Physicist

派生到基隐式指针类型转换

  •  0
  • The Quantum Physicist  · 技术社区  · 8 年前

    template <typename T> class Base {
    protected:
      Base() {}
    
    public:
      T *ptr;
      void setRelated() { ptr = this; }
    };
    
    class Derived : public Base<Derived> {};
    
    int main() {
      Derived d;
      d.setRelated();
      return 0;
    }
    

    根本原因 :这样做的原因是为了让使用此类的开发人员不用为此类中使用的每一个调用和算法从基到派生再到基进行转换,尤其是基是抽象的,不能自己实例化。

    此代码无法编译。它说:

    main.cpp:7: error: invalid conversion from ‘Base<Derived>*’ to ‘Derived*’ [-fpermissive]
       void setRelated() { ptr = this; }
                       ~~~~^~~~~~
    

    这个问题 Base<Derived>* Derived* 隐式(假设我们不应该重载每个方法)?

    1 回复  |  直到 8 年前
        1
  •  1
  •   πάντα ῥεῖ    8 年前

    你不能 Base 直接抽象。需要从另一个 1. .


    有没有办法使从基*到派生*的所有转换都隐式(假设我们不应该重载每个方法)?

    不,没有。

    CRTP 是使用 static_cast :

     void setRelated() { ptr = static_cast<T*>(this); }
    

    看看 STTCL 我在那里广泛使用了这种技术。