質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

715閲覧

<<(挿入演算子)をオーバーロードする関数の作り方を教えていただきたいです。

alizona

総合スコア126

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/11/02 03:47

C++ で、<<(挿入演算子)をオーバーロードする関数の作り方を教えていただきたいです。

8時間ほど改善しなくて、いろいろと追い込まれて似たような質問をしています。申し訳ありません。
どうぞよろしくおねがいします。

c++

1template <typename Type> 2class Animal{ 3 private: 4 int id; 5 int name 6 7 public: 8 void operator<<(HashEntry<Type>* tmp){ cout << tmp ->getValue(); }

C++

1//この下でオーバーライドした<<オペレーターを使用したいです。 2void printTable(){ 3 HashEntry<Type>* currentEntry = table[i]; 4 while(currentEntry -> getNext() != NULL){ 5 cout <<(currentEntry);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/11/02 04:12 編集

コードが部分的なのでわかりませんが、`void operator<<(HashEntry<Type>* tmp)` が Animal のメンバ関数となっていますが、Animal クラスとなにか関係があるのでしょうか。 オーバーロードした operator<<() で Animal クラスの id と name を出力するというならわかるのですが、HashEntry は Animal クラスに関係ないようにみえます。
alizona

2020/11/02 06:00

そうでした。誤解でした ありがとうございます。
guest

回答1

0

ベストアンサー

c++

1#include <iostream> 2 3using namespace std; 4 5template<typename Type> 6struct HashEntry{ 7 int key; 8 Type value; 9 HashEntry<Type> *next; 10 void operator>>(std::ostream& os){ 11 os << value; 12 } 13}; 14 15template<typename Type> 16std::ostream& operator<<(std::ostream& os, const HashEntry<Type> &tmp){ 17 os << tmp.value; 18 const HashEntry<Type> *it = tmp.next; 19 while(it){ 20 os << "->" << it->value; 21 it = it->next; 22 } 23 return os; 24} 25 26int main(){ 27 HashEntry<int> i1 = {0, 5, nullptr}, i2 = {1, 99, &i1}; 28 HashEntry<float> f1 = {0, 5.1, nullptr}; 29 HashEntry<string> s1 = {0, "a", nullptr}; 30 cout << i1 << "\n" << f1 << "\n" << s1 << "\n"; 31 cout << i2 << "\n"; 32 33 i2 >> cout; // HashEntry::operator>> の呼び出し 34}

投稿2020/11/02 04:41

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alizona

2020/11/02 06:13

ありがとうございます。助かります。 i2 >> cout; // HashEntry::operator>> の呼び出し とはどのようなことでしょうか? どうぞよろしくお願いいたします。
asm

2020/11/02 06:21

メンバ関数で演算子をオーバーロードすると左辺に対象のオブジェクトを置くことになるので cout << オブジェクト みたいな演算子を定義するためには、ostreamのメンバ関数にする必要があり、それは不可能ですね。 ということを実証したかった感じです
alizona

2020/11/02 06:35

ありがとうございます。 ./HashEntry.h:17:27: error: declaration of 'Type' shadows template parameter template<typename Type> ^ このようなエラーが表示されるのですが、アドバイスをいただけないでしょうか? 助けていただきありがとうございます。
alizona

2020/11/02 06:42

もし、template<typename Type> を、 ostream &operator << (ostream &strm, HashEntry<Type> &entry){ の上に書かない場合には、 コンパイルはできるのですが、出力される文字が全てアドレスです。
asm

2020/11/02 07:37

メンバ関数としてoperator<<を定義しているかと思いますが 前述したように無理です。 非メンバ関数として定義してください
alizona

2020/11/02 09:08

ありがとうございます。 main()の下記のように書きました。 template<typename Type> ostream &operator << (ostream &strm, HashEntry<Type> &entry){ strm<<"ID: "<<entry->getKey()<<","; strm<<"NAME:"<<entry->getValue()->getName(); return strm; } そうしたあと、HashTable.h で、下記のようにしています。 HashEntry<Type>* entry = hashArray[i]; while(entry->getNext() != NULL){ cout<<entry; entry = entry->getNext(); } その結果、NULLでない場合は、0x7f7f26c05a40 こう言った文字が出力されます。 アドバイスをいただけないでしょうか?
asm

2020/11/02 10:22

cout<<*entry; にするとよいのではないでしょうか?
alizona

2020/11/02 14:03

ありがとうございました。 無事できるようになりました。本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問