Грешка C2248 при използване на анализ на кода на Visual Studio 2012

Докато се опитвам да стартирам кодовия анализатор на 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 ]

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


person masrtis    schedule 23.11.2013    source източник


Отговори (1)


Не вярвам, че потоците трябва да могат да се копират. Въпросната линия обаче потенциално прави точно това. Както е написано, трябва да създаде временен std::ifstream и след това да копира-конструира inputFile, използвайки това.

Очевидно нормалният компилатор оптимизира конструкцията на копиране, така че редът завършва просто директно конструиране на inputFile. И очевидно това заобикаля всяка проверка дали изграждането на копие изобщо би било разрешено.

Очевидно анализът на кода прави по-задълбочена проверка и хваща несъответствието.

Тъй като няма причина да създавате временен ifstream на първо място, можете просто да пренапишете реда като:

std::ifstream inputFile(m_filename);
person TheUndeadFish    schedule 23.11.2013