Частный член класса шаблона в специализации

У меня есть класс шаблона следующим образом

template <typename T>
class Reader {
 public:
  Reader(std::string& filename, uint dummy_sid = 0) {...};
  bool isBroken() {return m_is_broken;}
  T getNext() {some operations; return m_event;}

 private:
  bool m_is_broken = false;
  uint m_dummy_sid = 0;
  T m_event;

};

И затем я создаю две специализации, похожие на следующую:

template<>
class Reader<NAME_A> {
 public:
  Reader(std::string& filename, uint dummy_sid = 0) {
    m_dummy_sid = dummy_sid;
    m_in_file = std::ifstream(filename);
  }
 private:
  std::ifstream m_in_file;
};

Поэтому я хотел бы добавить один частный член класса и переопределить конструктор. При компиляции кажется, что например в специализации член m_dummy_sid не виден (error: m_dummy_sid' was not declared in this scope; did you mean 'dummy_sid'?). Я думаю, что это не способ специализироваться и расширять один класс. Что я делаю не так?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, специализация шаблона класса dualReader должна иметь то же имя, что и Reader.

template<>
class Reader<NAME_A> {
 public:
 .....
 .....
};

Во-вторых, специализация шаблона Reader не может быть частью неспециализированного шаблона Reader. Это связано с тем, что C++ фактически угрожает шаблонным специализациям классов как совершенно разные типы. Единственное отношение, которое он имеет к исходному шаблону, — это имя.

Для вашей задачи больше подходит наследование. Вы можете наследовать от класса Reader

template<class T>
class dualReader : public Reader<T>{
 public:
 .....
 .....
 private:
 std::ifstream m_in_file;
};

Также, если вы хотите, чтобы производный класс имел доступ к членам базового класса, вы должны объявить члены базового класса как protected.

Исправьте по первому пункту, я только что отредактировал (забыл изменить при подготовке упрощенной версии). Угу по второму пункту. Так что я в основном должен дублировать код, я думаю.

Limone 03.04.2023 03:22

Здесь целью было иметь читатель различных типов входных файлов. В большинстве случаев с базовым шаблоном все в порядке, но затем мне захотелось добавить еще несколько функций для специальных типов.

Limone 03.04.2023 03:23

Вы по-прежнему можете добавлять функции в производные классы. Можете ли вы более конкретно указать функции, которые вы собираетесь добавить?

Karen Baghdasaryan 03.04.2023 03:54

Ничего особенного: обычно я передаю txt-файлы на вход, и мне нужен метод hasNext(), который читает строку и выполняет сопоставление с регулярным выражением. В нескольких случаях я передаю на вход файл, который может быть подготовлен специальным классом, в котором уже есть что-то подобное, поэтому hasNext() будет просто оболочкой. Таким образом, в основном коде у меня будет один и тот же объект чтения с одинаковыми именами методов для всех случаев.

Limone 03.04.2023 17:42

Другие вопросы по теме