C ++ Попытка добавить >> Перегрузка оператора в шаблон - PullRequest
0 голосов
/ 17 января 2020

У меня есть класс IPrintable, который является шаблоном, и класс, который является производным от него - Date. Я хочу добавить оператор >> в шаблон, но получаю сообщение об ошибке:

source.cpp(16): error C2259: 'Date': cannot instantiate abstract class
source.cpp(16): note: due to following members:
source.cpp(16): note: 'void IPrintable<Date>::toIs(std::istream &)': is abstract
iprintable.h(19): note: see declaration of 'IPrintable<Date>::toIs'

Я успешно добавил оператор << в шаблон следующим образом:

virtual void toOs(ostream& os) const = 0;
friend ostream& operator << (ostream& output, const IPrintable& toPrint) {
    toPrint.toOs(output);
    return output;
}

А потом я объявил virtual void toOs(ostream& os) const = 0; date.h и реализовал его в date.cpp.

Это мой IPrintable.h :

#pragma once
#include <iostream>
#include <string>
using namespace std;

template <class T>
class IPrintable {
private:


public:

    virtual void toOs(ostream& os) const = 0;
    friend ostream& operator << (ostream& output, const IPrintable& toPrint) {
        toPrint.toOs(output);
        return output;
    }

    virtual void toIs(istream& input) = 0;
    friend istream& operator >> (istream& input, IPrintable& toSet) {
        toSet.toIs(input);
        return input;
    }

};

Это это объявление в Date.h , под public:

virtual void toOs(ostream& output) const;
virtual void toIS(istream& input);

Это реализация << (toOs) и >> (* 1030) *) в Дата. cpp:

void Date::toOs(ostream& output) const {
    if (!isLeapYear(this->getDay(), this->getMonth(), this->getYear())) {
        cout << "Not a leap year";
        return;
    }
    output << getDay() << "/" << getMonth() << "/" << getYear();
}

void Date::toIS(istream& input) {
    int index;
    string str;
    input >> str;
    index = str.find('/');
    this->setDay(stoi(str.substr(0, index)));
    str = str.substr(index + 1);
    index = str.find('/');
    this->setMonth(stoi(str.substr(0, index)));
    str = str.substr(index + 1);
    this->setYear(stoi(str));
}

Пожалуйста, если вам нужна дополнительная информация, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы предоставить ее.

Спасибо!

1 Ответ

2 голосов
/ 17 января 2020

Ваш Date::toIS имеет заглавную S, а ваш IPrintable::toIs - нет. Если вы добавите override к объявлению Date::toIS, вы увидите, что оно на самом деле ничего не отменяет.

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