При попытке запустить анализатор кода Visual Studio 2012 этой функции я столкнулся с ошибкой C2248 в первой строке функции:
void InputFile::parseInputFile()
{
auto inputFile = std::ifstream(m_filename); // error occurs on this line
if (inputFile.is_open())
{
const auto fileBegin = std::istreambuf_iterator<char>(inputFile);
const auto fileEnd = std::istreambuf_iterator<char>();
const auto fileContents = std::string(fileBegin, fileEnd);
m_sectors.reserve(std::count(std::begin(fileContents), std::end(fileContents), '\n'));
const auto lineTokenizer = boost::tokenizer<boost::char_separator<char>>(fileContents, boost::char_separator<char>("\n"));
const auto symbolSeparator = boost::char_separator<char>(" ");
std::transform(std::begin(lineTokenizer), std::end(lineTokenizer), std::back_inserter(m_sectors),
[=](const std::string& line)
{
const auto symbolTokenizer = boost::tokenizer<boost::char_separator<char>>(line, symbolSeparator);
std::vector<std::string> symbols;
symbols.reserve(std::count(std::begin(line), std::end(line), ' '));
std::copy(std::begin(symbolTokenizer), std::end(symbolTokenizer), std::back_inserter(symbols));
return symbols;
});
}
}
Полное сообщение об ошибке приведено ниже:
ParseInput.cpp(24): ошибка C2248: 'std :: basic_ifstream <_Elem, _Traits> :: basic_ifstream': не может получить доступ к закрытому члену, объявленному в классе 'std :: basic_ifstream <_Elem, _Traits>' с помощью [_Elem = char, _Traits = std :: char_traits], проверяя, что исключенный экземпляр-конструктор 'std :: basic_ifstream <_Elem, _Traits> :: basic_ifstream (const std :: basic_ifstream <_Elem, _Traits> &)' можно вызвать с помощью [_Elem = char, _Traits = std :: char_traits] C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\fstream (827): см. объявление 'std :: basic_ifstream <_Elem, _Traits> :: basic_ifstream' с помощью [_Elem = char, _Traits = std :: char_traits] при преобразовании из 'std :: basic_ifstream <_Elem, _Traits>' в 'std :: basic_ifstream <_Elem, _Traits> &&' с [_Elem = char, _Traits = std :: char_traits]
Сообщение об ошибке не запускается, если я не выполняю анализ кода. Какая конкретная проверка вызывает эту ошибку, и можно ли ее отключить, чтобы анализ мог завершить мой код?
Я не считаю, что потоки должны быть скопируемыми. Однако данная линия потенциально делает именно это. Как написано, он должен построить временный std :: ifstream, а затем использовать copy-construct inputFile, используя это.
По-видимому, обычный компилятор оптимизирует построение копии, так что линия заканчивается просто конструированием inputFile напрямую. И, по-видимому, это обходит любую проверку того, было ли разрешено копирование.
Очевидно, анализ кода делает более тщательную проверку и улавливает несоответствие.
Поскольку нет причин для создания временного ifstream в первую очередь, вы можете просто переписать строку следующим образом:
std::ifstream inputFile(m_filename);