将派生的模板类分配给基类模板

时间:2018-07-06 02:24:30

标签: c++ templates

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

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类模板本身不是一个完整的类,但是这样的要求对我来说是很合理的。有什么其他选择可以实现我想要的吗?

1 个答案:

答案 0 :(得分:1)

  

理解基类模板本身不是一个完整的类,但是这样的要求对我来说是相当合理的。有什么其他选择可以实现我想要的吗?

合理,但您需要模板参数推导;因此,从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