Присвоить производный класс шаблона шаблону базового класса - PullRequest
0 голосов
/ 06 июля 2018

Это кажется невозможным, но я думаю, что разумно иметь то, что я искал. У меня есть следующий код:

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 голосов
/ 06 июля 2018

понимаю, что сам шаблон Базового класса не является полным классом, но такие требования для меня вполне разумны. Есть ли альтернативы для достижения того, чего я хочу?

Разумно, но вам нужно вывести аргументы шаблона; поэтому начиная с 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 a struct

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...