尝试在此函数上运行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&lt; _Elem,_Traits&gt; :: basic_ifstream':无法访问 在类'std :: basic_ifstream&lt; _Elem,_Traits&gt;'中声明的私有成员 同 [ _Elem =炭, _Traits =标准:: char_traits ] 同时检查elided拷贝构造函数'std :: basic_ifstream&lt; _Elem,_Traits&gt; :: basic_ifstream(const 的std :: basic_ifstream&LT; _Elem,_Traits&GT; &amp;)'可以调用 同 [ _Elem =炭, _Traits =标准:: char_traits ] C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ fstream(827):参见'std :: basic_ifstream&lt; _Elem,_Traits&gt; :: basic_ifstream'的声明 同 [ _Elem =炭, _Traits =标准:: char_traits ] 从'std :: basic_ifstream&lt; _Elem,_Traits&gt;'转换时到'std :: basic_ifstream&lt; _Elem,_Traits&gt; &安培;&安培;” 同 [ _Elem =炭, _Traits =标准:: char_traits ]
如果我没有运行代码分析,则不会触发错误消息。什么特定检查会触发此错误,是否可以禁用它以便分析可以在我的代码上完成?
答案 0 :(得分:1)
我不相信流应该是可复制的。但是,这条线可能正是这样做的。如上所述,它应构造一个临时的std :: ifstream,然后使用它来复制构造inputFile。
显然,普通编译器会优化复制构造,以便该行最终直接构造inputFile。显然,这是在绕过任何关于是否允许复制构造的检查。
显然,代码分析会进行更彻底的检查并发现差异。
由于没有理由首先构建临时的ifstream,你只需将该行重写为:
std::ifstream inputFile(m_filename);