Я пишу программу на С++, которая может получать данные из файла (переданного в качестве аргумента командной строки), из std::cin или std::istringstream. Он отлично работает и управляется с помощью std::istream*. Мне сказали, что это плохо, обработка необработанных указателей, поэтому я решил обернуть это в std::unique_ptr (т.е. std::unique_ptr). Проблема в том, что он не компилируется. Насколько я могу судить по ошибкам, std::istream защитил себя от использования для выделения памяти. Я пытался погуглить, но не думаю, что кто-то задавал подобный вопрос раньше (поскольку я видел только вопросы, относящиеся только к std::unique_ptr). Кто-нибудь знает, как этого добиться?
edit: errors: In file included from /usr/include/c++/4.8/iostream:40:0,
from /home/dtscode/Desktop/SLang/src/main.cpp:1:
/usr/include/c++/4.8/istream: In function ‘int main(int, char**)’:
/usr/include/c++/4.8/istream:606:7: error: ‘std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits<char>]’ is protected
basic_istream()
^
compilation terminated due to -Wfatal-errors.
make[2]: *** [CMakeFiles/slang.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/slang.dir/all] Error 2
make: *** [all] Error 2
в ответ на эту строку: std::unique_ptr Stream(new std::istream());
Я также пробовал это без вызова конструктора istreams и без чего-либо в конструкторе unique_ptrs.
редактировать 2:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <memory>
#include <lexer.hpp>
int main(int argc, char *argv[]) {
std::unique_ptr<std::istream> Stream(new std::istream());
std::vector<std::string> Arguments(argv, argv + argc);
switch(argc) {
case 1:
Stream = &std::cin;
break;
case 2:
Stream = new std::ifstream(Arguments[1]);
break;
case 3:
if(Arguments[1] == "-c") {
Stream = new std::istringstream(Arguments[2]);
break;
}
default:
std::cerr<<"error: invalid arguments."<< std::endl;
return 0;
}
Token::Lexeme CurrentToken = Token::Start;
while(*Stream) {
CurrentToken = getToken(Stream);
lex_debug();
}
if(Stream != &std::cin) {
delete Stream;
}
return 0;
}
istream*
, почему бы просто не использоватьstd::istream
- person Fantastic Mr Fox   schedule 09.07.2014