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

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

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

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

Q&A

解決済

3回答

7839閲覧

c++のエラーについて

freecss

総合スコア8

C++

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

0グッド

0クリップ

投稿2017/02/27 20:13

###前提・実現したいこと
c++でデバッグ用の関数を作っているのですが,以下のようなエラーが出てしまい困っています.

###エラーメッセージ

test.cpp:10:9: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'const std::__1::vector<int, std::__1::allocator<int> >') cerr<<first<<" ";debug(rest...); ~~~~^ ~~~~~

###該当のソースコード

cpp

1#include <iostream> 2#include <sstream> 3#include <vector> 4using namespace std; 5 6inline void debug(){ cerr << endl; } 7 8template<class First, class... Rest> 9void debug(const First& first, const Rest&... rest){ 10 cerr<<first<<" ";debug(rest...); 11} 12 13template<typename T>string join(vector<T>&v, string del=", ") 14{ stringstream s; 15 for (int i = 0; i < v.size(); i++) s<<del<<v[i]; 16 return s.str().substr(del.size()); 17} 18 19template<typename T>ostream& operator<<(ostream& o, vector<T>&v) 20{ 21 if(v.size()) o<<"["<<join(v)<<"]"; 22 return o; 23} 24 25int main(){ 26 vector<int> v; 27 for (int i = 0; i < 8; i++) { 28 v.push_back(i); 29 } 30 debug(v); 31 return 0; 32} 33

###補足情報
コンパイラ: clang++
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix

よろしくお願いします.

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

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

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

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

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

guest

回答3

0

こんにちは。

operator<<がstd::vector<T>について未定義だからです。
単純に定義すればOKです。
例えば、下記をinline void debug(){ cerr << endl; }行の直前あたりに追加してもビルドできます。

C++

1template<typename T> 2ostream& operator<<(ostream& iOStream, vector<T> const& iVector) 3{ 4 iOStream << "std::vector<T>{"; 5 bool aIsFirst=true; 6 for (auto&& element : iVector) 7 { 8 if (aIsFirst) 9 aIsFirst=false; 10 else 11 iOStream << ","; 12 iOStream << element; 13 } 14 iOStream << "}"; 15 return iOStream; 16}

なお、当然なのですが、Tとしてoperator<<が未定義のものを与えると元のエラーと同じエラーがでますので、テンプレートにしないで、std::vector<int>を受け取るようにしても良いかも知れません。

投稿2017/02/28 00:59

Chironian

総合スコア23272

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

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

0

ベストアンサー

これでどうだろ。二か所ほど、足りなかったconstをくっつけました。Visual C++ 2015 で確認済。

C++

1#include <iostream> 2#include <sstream> 3#include <vector> 4using namespace std; 5 6inline void debug(){ cerr << endl; } 7 8template<typename T>string join(const vector<T>&v, string del=", ") 9{ stringstream s; 10 for (int i = 0; i < v.size(); i++) s<<del<<v[i]; 11 return s.str().substr(del.size()); 12} 13 14template<typename T>ostream& operator<<(ostream& o, const vector<T>&v) 15{ 16 if(v.size()) o<<"["<<join(v)<<"]"; 17 return o; 18} 19 20template<class First, class... Rest> 21void debug(const First& first, const Rest&... rest){ 22 cerr<<first<<" ";debug(rest...); 23} 24 25int main(){ 26 vector<int> v; 27 for (int i = 0; i < 8; i++) { 28 v.push_back(i); 29 } 30 debug(v); 31 return 0; 32}

投稿2017/02/27 22:30

編集2017/02/27 22:31
episteme

総合スコア16614

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

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

freecss

2017/02/28 04:24

上記のソースコードで正常に動作しました. ありがとうございました. 基本的にはvector<T>を<<する定義が見つからないということが問題で,constをつけないとエラーが発生していたのは<<に対してconst vector<T>を適用しており,operandが違かったのが原因ということでしょうか.
episteme

2017/02/28 05:32

debug(const First& first...) ですから debug(v) で const vector<T>& が渡されたと思ってる。 ostream << const vector<T>& できるかと探してみたけど const 付きで << する定義が 見当たらんかったのでエラー。ってとこでしょね。
guest

0

vector<int> v; ... debug(v); したとこで debug()内でostream に vector<int> を << してますけど、vector<T> を ostream に << する方法が見つからんのでしょう。

debug()の定義をmainの直前に移動したらどうなります?

投稿2017/02/27 20:29

episteme

総合スコア16614

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

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

freecss

2017/02/27 20:40

移動後にも同様のエラーメッセージが出てしまいました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問