🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

1回答

1606閲覧

C++ ストリーム出力演算子をstd::arrayにオーバーロードしたい

pupperccino

総合スコア17

C++

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

0グッド

0クリップ

投稿2020/12/12 07:48

実現したいこと

std::arrayにストリーム出力演算子<<をオーバーロードしたい。

試したこと

std::vectorで同じことをしているサイトを見つけたので、std::arrayにも使えるように改造してみました。
エラーが出てしまうので、自分がやった改造だと問題があるようなのですが、どこが問題なのか分かりません。C++に詳しい方にご教示いただけると非常に助かります。

C++

1#include <vector> 2#include <array> 3#include <iostream> 4 5// ネットで見つけた方法(vector) 6template <typename T> 7std::ostream &operator<<(std::ostream &o, const std::vector<T> &v) 8{ 9 o << "{"; 10 for (int i = 0; i < (int)v.size(); ++i) 11 { 12 std::cout << (i > 0 ? ", " : "") << v.at(i); 13 } 14 o << "}"; 15 return o; 16} 17 18// arrayにも使えるように直してみた 19template <typename T, unsigned int N> 20std::ostream &operator<<(std::ostream &o, const std::array<T, N> &a) 21{ 22 o << "{"; 23 for (int i = 0; i < (int)a.size(); ++i) 24 { 25 std::cout << (i > 0 ? ", " : "") << a.at(i); 26 } 27 o << "}"; 28 return o; 29} 30 31 32 33int main() 34{ 35 std::vector<int> v = {1, 2, 3}; 36 std::cout << "v = " << v << std::endl; // v = {1, 2, 3} 37 38 std::array<int, 3> a = {-1, -2, -3}; 39 std::cout << "a = " << a << std::endl; // <- エラーがでる 40 41 return 0; 42}

発生している問題・エラーメッセージ

❯ g++ test.cpp -o test test.cpp: 関数 ‘int main()’ 内: test.cpp:35:25: エラー: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘std::array<int, 3>’) 35 | std::cout << "a = " << a << std::endl; | ~~~~~~~~~~~~~~~~~~~ ^~ ~ | | | | | std::array<int, 3> | std::basic_ostream<char> In file included from /usr/local/include/c++/9.3.0/iostream:39, from test.cpp:3:

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

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

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

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

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

guest

回答1

0

ベストアンサー

この場合はテンプレート関数の定義自体は失敗にならず、次の候補を探そうとしてしまう (いわゆる SFINAE。 しかし他の候補は存在しない) ので「該当する関数がない」というエラーになってしまいます。 テンプレート変数の unsigned int Nstd::size_t N にすれば通るはずです。

その他に気づいた点として operator<< の定義の中で std::cout に対して << している箇所は o に対して出力すべきではないでしょうか。

投稿2020/12/12 08:13

編集2020/12/12 08:14
SaitoAtsushi

総合スコア5684

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

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

pupperccino

2020/12/12 09:00

ありがとうございます!教えていただいたとおりstd::size_tにすることで問題なく動きました。 また、オーバーロードの定義の中のstd::coutもoに直しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問