我有这样的代码
std::ifstream file(filename, std::ios_base::in);
if(file.good())
{
file.imbue(std::locale(std::locale(), new delimeter_tokens()));
for(auto& entry : std::istream_iterator<std::string>(file))
{
std::cout << entry << std::endl;
}
}
file.close();
其中std::istream_iterator<std::string>
的begin()
和end()
被定义如下
template<class T>
std::istream_iterator<T> begin(std::istream_iterator<T>& stream)
{
return stream;
}
template<class T>
std::istream_iterator<T> end(std::istream_iterator<T>& stream)
{
return std::istream_iterator<T>();
}
这就是马克·尼尔森也在博士道博的写在这里 。 唉,代码不能在我的Visual Studio 2012编译错误信息
错误C3312:发现类型“的std :: istream_iterator <_Ty>”没有可调用“开始”功能
和
错误C3312:发现类型“的std :: istream_iterator <_Ty>”没有可调用的“结束”功能
问:有什么是我还没有发现,臭虫在编译器(不太可能,但以防万一),或者......好吧,任何想法?
这个问题是清理相当大,由作为建议XEO 。 为了提供更多的背景,这是关系到我引用其他问题 #2,我想知道如何使基于行解析清洁剂比普通环。 编码,并从互联网检查,并有点我有一个效果图如下
std::ifstream file(filename, std::ios_base::in);
if(file.good())
{
file.imbue(std::locale(std::locale(), new delimeter_tokens()));
for(auto& entry : istream_range<std::string>(file)
{
std::cout << entry << std::endl;
}
}
file.close();
但有轻微的障碍我试图补救。 我认为它看起来更自然写在失败编译和不喜欢的代码
for(auto& entry : istream_range<std::string>(file)
我想请记下不同的迭代器。 该delimeter_tokens的定义如下纳瓦兹好心显示在这里 (代码不重复),并istream_range在码合成博客这里 。 我想开始和结束的实现应该工作,如在上述码合成的博客文章公布
最后一条规则(回退到自由站立开始()和end()函数)允许我们非侵入适应现有容器到基于范围for循环接口。
因此,我与所有的(IR)相关背景的问题。