首页 > 解决方案 > 将派生模板类分配给基类模板

问题描述

这似乎是不可能的,但我认为拥有我想要的东西是合理的。我有以下代码:

template <typename T>
class Data{
  T getData() {
    return data;
  }
  private:
    T data;
};

template <typename T>
class Base : public Data<T> {
  public:
    void someCommonAction() { }
};

class DerivedInt : public Base<int> {
};

class DerivedFloat : public Base<float> {
};

我想将派生对象分配给Base类,但编译器抱怨模板参数是必需的Base

Base b = DerivedInt{};

我知道Base类模板本身并不是一个完整的类,但是这样的要求对我来说是很合理的。有没有其他方法可以实现我想要的?

标签: c++templates

解决方案


明白Base类模板本身并不是一个完整的类,但是这样的要求对我来说还是很合理的。有没有其他方法可以实现我想要的?

合理但需要模板参数推导;所以从 C++17 开始,你可以添加一些东西

template <typename T>
Base(Base<T>) -> Base<T>;

Base b = DerivedInt{};

应该管用。

题外话:观察

template <typename T>
class Data{
  T getData() {
    return data;
  }
  private:
    T data;
};

getData()方法是私有的

我想你的意图是公开

模板

class Data{
  public:
     T getData() {
       return data;
     }
  private:
    T data;
};

或做Data一个struct


推荐阅读