私はこのようなコードを持っています
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>();
}
これは、マーク・ネルソンがドブ博士のここにも書いていることです。残念ながら、コードはVisualStudio2012でコンパイルできずエラーメッセージが表示されます
エラーC3312:タイプ'std ::istream_iterator<_Ty>'に対して呼び出し可能な'begin'関数が見つかりません
と
エラーC3312:タイプ'std ::istream_iterator<_Ty>'に対して呼び出し可能な'end'関数が見つかりません
質問:私が気付いていないこと、コンパイラのバグ(ありそうもないが、念のため)、または...ええと、何かアイデアはありますか?
Xeo
のアドバイスに従って、この質問はかなりクリーンアップされます。より多くの背景と参照を提供するために、これはStackoverflowに関する他の質問に関連しています。私は、ラインベースの解析を通常のループよりもクリーンにする方法を考えていました。インターネットからのコーディングとチェックのビット、そして私は次のように作業スケッチを持っていました
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は、Nawazが親切にここに示したように(コードは複製されていません)、istream_rangeはコード合成ブログのように定義されています。前述のCodeSynthesisブログ投稿で宣伝されているように、開始と終了の実装は機能するはずです。
最後のルール(独立したbegin()およびend()関数へのフォールバック)により、既存のコンテナーを範囲ベースのforループインターフェイスに非侵襲的に適合させることができます。
したがって、すべての(無関係な)背景を持つ私の質問。