こんにちは
C++を学習中の初心者です。
入出力マニピュレータについて教えていただきたいのですが、
iomanip.cppをインクルードしなくてもendlが利用できるのは
どうしてなのでしょうか?
iostream.cppをみましたが直接iomanio.cppをインクルードして
はいませんでした。
ご存知の方よろしくお願いします。
一般に xxx.cpp を include することは無いです。
よって iomanip.cpp は <iomanip> の誤りだと解釈して話を続けます。
>iomanip.cppをインクルードしなくてもendlが利用できるのは
std::endl は <ostream> で宣言されることになっています。
なので <iomanip> とは直接には無関係です。
>どうしてなのでしょうか?
なぜ?を納得するには template の宣言と定義とインスタンス化に
ついて理解する必要があります。
とりあえず endl は template な関数で、必要な時にインスタンス化
されるのですが...
tetrapod さんご返答ありがとうございます。
なるほど分りました。
iosクラスの派生クラスなのでiostreamのインクルードでOKなのですね。
> 入出力マニピュレータについて教えていただきたいのですが、
> iomanip.cppをインクルードしなくてもendlが利用できるのは
> どうしてなのでしょうか?
> iostream.cppをみましたが直接iomanio.cppをインクルードして
> はいませんでした。
> ご存知の方よろしくお願いします。
まず、インクルードしているのはヘッダファイルだと思うけど、
書き間違いだよね?
endlの宣言は<ostream.h>にあります。c++では<stdio.h>の代わりに
<iostream.h>を使うことも多いですが、<iostream.h>の中で<ostream.h>
をインクルードしています。
書式設定(setw()等)を使いたい場合には、<iomanip.h>をインクルードしますが、
この中で<iostream.h>をインクルードしています。
いくつか勘違いしていませんか?
# 以上はVC6.0で確認。
# ついでに#include <iostream>(拡張子なし)とかとは、別の話なので
# 混同しないように注意してください。
> なるほど分りました。
…多分わかってない。
> iosクラスの派生クラスなのでiostreamのインクルードでOKなのですね。
std::endl は <iostream> あるいは <ostream> で宣言されているから。
# iosの派生だなんて誰も一言も言ってない
たいちうさん、επιστημηさんご返答ありがとうございます。
入出力マニュピュレータについてもっと深く学習します。