Как объявить переменную File.byLine ()? - PullRequest
0 голосов
/ 17 мая 2018

Мне нужен класс или структура, которая бы выглядела как

struct ThingReader {
    ???? lines;
    Thing thing;

    this(File f) {
        this.lines = f.byLine;
        popFront;
    }

    @property bool empty()      { return lines.empty; }
    @property ref Thing front() { return thing; }
    void popFront() {
        if (! empty) {
            auto l = lines.front;
            lines.popFront;
            parseLine(l, thing); // Not shown
        }
    }
}

но я не знаю, какое объявление типа поместить в место, где ???? есть.

Если я попытаюсь auto lines, то ошибка «Ошибка: нет идентификатора для строк объявления».

Если я оставлю вывод типа для компилятора и попробую что-то вроде:

struct ThingReader(Lines) {
    Lines lines;
    Thing thing;

    this(File f) {
        this.lines = f.byLine;
        popFront;
    }
    // etc.
}

тогда компилятор, кажется, в порядке с этим объявлением, но когда я позже пытаюсь объявить auto reader = ThingReader(f), я получаю "Ошибка: struct huh.ThingReader не может вывести функцию из типов аргументов! () (Файл)".

Функция File.byLine объявлена ​​для возврата auto, но это (см. Выше) делает не работает для меня.

Когда я объявляю auto lines = f.byLine и проверяю его тип, я вижу что это ByLine!(char, char).
Когда я пытаюсь объявить ByLine lines, я получаю «Ошибка: неопределенный идентификатор ByLine» и когда я пытаюсь объявить std.stdio.ByLine lines, я получаю "Ошибка: неопределенный идентификатор ByLine в модуле std.stdio".
Когда я пытаюсь объявить ByLine!(char, char), я получаю «Ошибка: шаблон экземпляр ByLine! (char, char) шаблона 'ByLine' не определен ", и std.stdio.ByLine!(char, char) дает мне "Ошибка: идентификатор шаблона 'ByLine' не является членом модуля 'std.stdio' ".

1 Ответ

0 голосов
/ 17 мая 2018

Как упомянул Адам в комментариях, вы можете использовать typeof(File.byLine()), чтобы получить нужный тип;необходимо добавить заключительные скобки, поэтому typeof(File.byLine) не работает.Причина, по которой вы не можете явно указать тип для lines, заключается в том, что структура, возвращаемая функцией byLine, является закрытой, поэтому на нее нельзя ссылаться извне std.stdio модуля.

...