У меня есть класс шаблона следующим образом
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'?
). Я думаю, что это не способ специализироваться и расширять один класс. Что я делаю не так?
Прежде всего, специализация шаблона класса 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
.
Здесь целью было иметь читатель различных типов входных файлов. В большинстве случаев с базовым шаблоном все в порядке, но затем мне захотелось добавить еще несколько функций для специальных типов.
Вы по-прежнему можете добавлять функции в производные классы. Можете ли вы более конкретно указать функции, которые вы собираетесь добавить?
Ничего особенного: обычно я передаю txt-файлы на вход, и мне нужен метод hasNext(), который читает строку и выполняет сопоставление с регулярным выражением. В нескольких случаях я передаю на вход файл, который может быть подготовлен специальным классом, в котором уже есть что-то подобное, поэтому hasNext() будет просто оболочкой. Таким образом, в основном коде у меня будет один и тот же объект чтения с одинаковыми именами методов для всех случаев.
Исправьте по первому пункту, я только что отредактировал (забыл изменить при подготовке упрощенной версии). Угу по второму пункту. Так что я в основном должен дублировать код, я думаю.