【问题标题】:Assign derived template class to base class template将派生模板类分配给基类模板
【发布时间】:2018-12-14 13:53:33
【问题描述】:

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

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


【解决方案1】:

理解 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

【讨论】:

  • 这只能用 C++17 实现吗?
  • @neevek - 直接Base b = something;?是的,据我所知。在 C++17 之前,您可以创建一个 make_base()(遵循 std::make_tuple()std::make_pair() 示例)并使用 autoauto b = make_base(DerivedInt{});
猜你喜欢
  • 2014-06-22
  • 2019-11-09
  • 1970-01-01
  • 2017-01-13
  • 2016-08-17
  • 2016-02-17
  • 2015-04-10
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多