【问题标题】:inheriting from a template class causes errors从模板类继承会导致错误
【发布时间】:2010-08-13 22:15:05
【问题描述】:

我有一个模板类 MyTemplate。它工作正常。但是,一旦我创建了另一个派生自它的类,就会出现错误。

//main.cpp
template <typename T> class MyTemplate {
    public:
        T* test() {
            return new T(this); //error here.
        }
};

template <typename T> class MyTemplate2 : public MyTemplate<T> { 
};

class MyClass {
    public:
        MyClass(MyTemplate2<MyClass>* source) {
        }
};

int main() {
    MyTemplate2<MyClass>().test();
    return 0;
}

我得到的错误是:main.cpp|4|error: invalid conversion from 'MyTemplate&lt;MyClass&gt;* const' to 'MyTemplate2&lt;MyClass&gt;*'

据我了解,MyTemplate 中的“this”属于 MyTemplate 类型。但我希望它是 MyTemplate2。我可以进行显式转换,但这需要将第二个参数传递给模板类,而且似乎应该有更好的解决方案。有吗?

【问题讨论】:

  • 另一种解决方案是让 MyClass 的构造函数采用 MyTemplate&lt;MyClass&gt;* 参数。
  • @UncleBens 在我的真实代码中,MyTemplate2 有一些在 MyClass 的构造函数中使用的附加属性/方法。
  • 然后在 MyClass 的构造函数中进行转换,如果您不想在 MyTemplate 构造函数中进行转换(这会有点令人不安,因为您会介绍有关派生类存在的知识进入那个基地)。

标签: c++ templates inheritance compiler-errors


【解决方案1】:

您尝试的只是将Base*(即this)传递给Derived*,这是错误的方法。您需要显式转换才能执行此向下转换。

【讨论】:

    【解决方案2】:

    使用“克隆”方法怎么样?

    template <typename T> class MyTemplate { 
        public: 
            T* test() { 
                return clone(); //error here. 
            } 
            virtual T *clone() = 0;
    }; 
    
    template <typename T> class MyTemplate2 : public MyTemplate<T> {  
        public:
            T *clone(){return new T(this);}
    }; 
    
    class MyClass { 
        public: 
            MyClass(MyTemplate2<MyClass>* source) { 
            } 
    }; 
    
    int main() { 
        MyTemplate2<MyClass>().test(); 
        return 0; 
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 2017-12-11
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 2018-05-23
      • 2018-01-18
      • 1970-01-01
      • 2017-08-02
      相关资源
      最近更新 更多