Ошибка C2248 с использованием анализа кода Visual Studio 2012

0

При попытке запустить анализатор кода 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]

Сообщение об ошибке не запускается, если я не выполняю анализ кода. Какая конкретная проверка вызывает эту ошибку, и можно ли ее отключить, чтобы анализ мог завершить мой код?

Теги:
c++11
visual-studio-2012
static-analysis
code-analysis

1 ответ

1
Лучший ответ

Я не считаю, что потоки должны быть скопируемыми. Однако данная линия потенциально делает именно это. Как написано, он должен построить временный std :: ifstream, а затем использовать copy-construct inputFile, используя это.

По-видимому, обычный компилятор оптимизирует построение копии, так что линия заканчивается просто конструированием inputFile напрямую. И, по-видимому, это обходит любую проверку того, было ли разрешено копирование.

Очевидно, анализ кода делает более тщательную проверку и улавливает несоответствие.

Поскольку нет причин для создания временного ifstream в первую очередь, вы можете просто переписать строку следующим образом:

std::ifstream inputFile(m_filename);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню