Loading...
Jovanna avatar Jovanna 186 Точки

С++Advanced, Task 05_03 - Parser - работа с темплейти

Здравейте,

не мога да разбера защо в main()  и на трите места в Parser<int> p(std::cin, stopLine);    на  std::cin  ми дава следната грешка (с описание на съответния тип, че го няма):  " no instance of constructor "Parser<T>::Parser[with T=std::string  (съответно int, и  Song)]" matches the argument list argument types are: (std::istream, std::string)  ?

в Parser.h работя с темплейти:    (Също и класа Song не го разпознава в този хедър, защо?) Явно нещо много съм "разкрасила"  с новите знания... опитвам се и за Song да направя специализация, но само се опитвам ...

Може би подходът за решаване на задачата ми е погрешен? Моля за хелп...

Parser.h

template <typename T>
class Parser {
private:

    static getLine(istream & in, std::string s) {
        T variableUnknownType;
        while (in && s != this->limiter) {
            in >> variableUnknownType;
            this->dataLi.push_back(variableUnknownType);
            ostringstream oss;
            oss << variableUnknownType;
            s = oss.str();
        }
    }
    
    std::string limiter;
    std::list<T> dataLi;

public:

    Parser(std::cin, std::string limiter) :
        dataLi(Parser::getLine(std::cin, limiter),
            limiter(limiter)) {}

    template <typename T1>
    bool readNext(T1& o) {
        if (!this->dataLi.empty()) {
            o = *(dataLi.begin());
            this->dataLi.erase(dataLi.begin());
            return true;
        }
        return false;
    }
    bool readNext<Song> (Song & o) {
        if (!this->dataLi.empty()) {
            o = *(dataLi.begin());
            this->dataLi.erase(dataLi.begin());
            return true;
        }
        return false;
    }
 

Тагове:
0
C++ Programming 08/10/2018 14:09:06
Jovanna avatar Jovanna 186 Точки

Направо банкет ще дам! 100т!! Жоро, страхотно обясняваш, благодаря ти.

Но, не разбирам  това специфично ползване на стриймовете: как така се инициализира обект със стрийм, макар че го написах, как работи това?:

полета на клас Parser:

std::string limiter;
    T currElement;

ctor: Parser(std::istream & in, std::string limiter) :
        limiter(limiter) {}

**

викане от main() на ctor-a:     Parser<int> p(std::cin, stopLine);

Този cin  не вкарва ли данни от входа? Очаквах да ми се загубят данните от него и да започне да въвежда с метода readNext(n) от следващия входен елемент. И ако не се губят данните му, защо не се губят? И, защо cin присъства в инициализацията на обекта от класа?

Поздрави!

 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.