Я разрабатываю API с использованием библиотеки LLVM, которая будет принимать поток вывода в качестве одного из параметров конструктора. Стандарты кодирования LLVM диктуют следующее:
Используйте raw_ostream
LLVM включает в себя легкий, простой и эффективный поток
реализация в llvm / Support / raw_ostream.h, которая предоставляет все
общие черты std :: ostream. Весь новый код должен использовать
raw_ostream вместо ostream.В отличие от std :: ostream, raw_ostream не является шаблоном и может быть переслан
объявлен как класс raw_ostream. Общедоступные заголовки обычно не должны
включите заголовок raw_ostream, но используйте предварительные объявления и
постоянные ссылки на экземпляры raw_ostream.
Я должен соблюдать стандарты кодирования LLVM, поэтому я пытаюсь принять raw_ostream в качестве параметра в моем конструкторе. Я попытался передать raw_ostream по ссылке и по указателю, но я получаю следующее сообщение об ошибке во время компиляции:
примечание: потенциальный конструктор недопустим: нет известных преобразований из
«LLVM :: raw_ostream &() ‘до’ llvm :: raw_ostream &»…
Как должен выглядеть мой конструктор, чтобы принять параметр типа ‘llvm :: raw_ostream &() ‘? Я хотел бы инициализировать член класса для этого потока вывода.
Вот мой текущий код:
Конструктор
MyClass(raw_ostream &OS) : OutputStream(OS) {}
гость
MyClass x = new MyClass(&outs);
outs
задокументировано, начиная с строки 665 эта ссылка
Есть множество примеров в источнике LLVM, где raw_ostream
является аргументом функции / метода. Это почти всегда (..., raw_ostream &OS, ...)
Вот типичный пример из CodeGen/AsmPrinter/AsmPrinter.cpp
:
static void emitComments(const MachineInstr &MI, raw_ostream &CommentOS) {
// ... code
}
Других решений пока нет …