
はじめまして。
質問があります。
class Foo {
・・・
// NG
friend ostream& operator<< (const ostream& out , Foo& c);
・・・
};
挿入演算子<<をオーバーロードするとき、挿入演算子関数の第1引数をconst ostream& outのようにconstを修飾するとコンパイルエラーに
なります。私としては、outの状態を変更したくないという意味
で修飾したのですが、なぜコンパイルエラーになるのかがわかりません。どうかご教授お願いします。
現在、Visual C++ 2005 Express Editionを使用しています。
No.4ベストアンサー
- 回答日時:
>コメントアウトして実行してみたところ、コンパイルエラーが
>でなくなりました。outはやはり、変更されているのですね。
蛇足ですが、コンパイラは out が変更されるかどうかをチェックしているのではなくて、あくまでその宣言に const 指定がないことを見てエラーとしています。
したがって、本当は内容を変更していない hoge(ostream& out) を operator<<(const ostream& out, Foo& c) の実装中に使ってもエラーになります。
逆に、Foo の定義されたネームスペースの中で operator<<(const ostream& out, const std::string&) 等が定義されていれば、そっちを使うのでエラーにはなりません。
この回答への補足
koko_u_様へ
連絡が遅れました。すみませんでした。
ご回答ありがとうございます。
コンパイラがoutが変更されているかどうかをチェックしているのではなく、宣言の形式だけを見てエラーとしていることがわかり、そういう
ものなのだと、理解しています。
ただ、
>逆に、Foo の定義されたネームスペースの中で operator<<(const ostream& out, const std::string&) 等が定義されていれば、そっちを使うのでエラーにはなりません。
を動作確認しようと思い、サンプルコード全体をを単純に
namespace foo {}等で囲ってみてもエラーが出てしまいます。
多分私自身勘違いをしていると思いますが、具体的にどういうことなの
かご教授お願いします。別件で改めて質問をさせていただいても
かまいません。(本質問は良回答とさせていただきます。)
No.3
- 回答日時:
>コンパイラがostream& outを使用しているのが原因なのですね。
ちがう。orz
「re-entry さんが」std::operator<<(ostream& out, ... ) を使っているからです。
コンパイラは親切にも out が変更されるよと教えてくれているのです。
koko_u様へ
ご回答ありがとうございました。
勘違いを指摘してくださいまして、感謝しております。
挿入演算子関数内のすべての定義内容を
コメントアウトして実行してみたところ、コンパイルエラーが
でなくなりました。outはやはり、変更されているのですね。
勉強になりました。
ありがとうございました。
No.2
- 回答日時:
>確かにoperator<<(const ostream &out,Car &c)の定義内容は
>outオブジェクトの状態を変更する記述がないように思えるのですが、
>間違いでしょうか?
コンパイラから見ると
out << "ナンバー=" << c.num << ":" << "ガソリン=" << c.gas << endl;
で std::operator<<(ostream& out, ... ) を使用しているので、out が変更されない保証がないとしてコンパイルエラーになります。
また、実際 out に文字列を書き込めば、ストリームの状態が変更されるので const にはできません。
No.1
- 回答日時:
関数の中身がわからんので何とも言えませんが、
ostream を何らか操作すれば内容はかわると思いますが。
この回答への補足
koko_u_様へ
ご回答ありがとうございました。
サンプルを提示するべきでした。すみません。
----------------------------------------------------------------
#include <iostream>
using namespace std;
class Car {
private:
int num;
double gas;
public:
Car(int num,double gas);
friend void operator<<(const ostream &out,Car &c);
};
Car::Car(int num, double gas) {
this->num = num;
this->gas = gas;
}
void operator<<(const ostream &out,Car &c)
{
out << "ナンバー=" << c.num << ":"
<< "ガソリン=" << c.gas << endl;
}
int main()
{
Car *car = new Car(15, 26.7);
cout << *car;
return (0);
}
----------------------------------------------------------------
確かにoperator<<(const ostream &out,Car &c)の定義内容はoutオブジェクトの状態を変更する記述がないように思えるのですが、間違いでしょうか?どうかよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- ビデオカード・サウンドカード 通常でLINE OUT端子から音を出したい 4 2022/08/04 22:07
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- 英語 切り分けて形ある物となった食べ物の可算、不可算の扱いについて 6 2022/11/03 16:10
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
EclipseでJava
-
文字列の引き算
-
「続行するには何かキーを押し...
-
[JAVA]try 内の変数を外で!?
-
曜日の取得方法を教えて下さい!
-
JAVA 文字色変更
-
標準入力をするメソッドを作り...
-
LC発振回路-ループ利得
-
JAVAでの占い
-
Javaのコマンドライン引数を使...
-
コメントアウトされたエスケー...
-
エクセルマクロ文で、赤文字セ...
-
vb6 オブジェクトライブラリは...
-
System.err. printlnとSystem.o...
-
System.out.printlnの意味がよ...
-
ループ処理の際、最後だけ","を...
-
大量のデータを読み込んで表示...
-
動的配列が存在(要素が有る)か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
EclipseでJava
-
[JAVA]try 内の変数を外で!?
-
JAVAのDouble型の小数点以下の...
-
文字列の引き算
-
「続行するには何かキーを押し...
-
会員情報登録プログラムの作成...
-
Javaのコマンドライン引数を使...
-
java プログラミングについて
-
Javaでカレントディレクトリを...
-
複数行キーボード入力した後に...
-
JAVA 文字色変更
-
エクセルマクロ文で、赤文字セ...
-
配列を後ろから数えるには?
-
java シンボルが見つかりません...
-
改行の判定方法
-
JAVAのエラーの意味が分かりま...
-
JAVA 三角形の判定
-
nullcline
おすすめ情報