Open1
'operator' の記述順序について
Call to function 'operator<<' that is neither visible in the template definition nor found by argument-dependent lookup
記述する順序を間違えた系。
#include <bits/stdc++.h>
using namespace std;
template<typename T>
std::ostream & operator<<(std::ostream & Str, vector<T> const & vec) {
Str << "[";
for (int i = 0; i < vec.size(); ++i) {
if (i != 0) cout << ", ";
cout << vec.at(i);
// error: Call to function 'operator<<' that is neither visible in the template definition nor found by argument-dependent lookup
}
Str << "]";
return Str;
}
template<typename L, typename R>
std::ostream & operator<<(std::ostream & Str, pair<L, R> const & p) {
Str << "[ " << p.first << " : " << p.second << " ]";
return Str;
}
int main(){
vector<vector<pair<int, int>>> x;
// x の中身を詰める処理
cout << x << endl;
}
vector の中に pair を入れているので pair についての <<
定義を先に書く必要があったっぽい。
そのように順序を入れ替えたらエラーが消えた。
template<typename L, typename R>
std::ostream & operator<<(std::ostream & Str, pair<L, R> const & p) {
Str << "[ " << p.first << " : " << p.second << " ]";
return Str;
}
template<typename T>
std::ostream & operator<<(std::ostream & Str, vector<T> const & vec) {
Str << "[";
for (int i = 0; i < vec.size(); ++i) {
if (i != 0) cout << ", ";
cout << vec.at(i);
}
Str << "]";
return Str;
}
プロトタイプ宣言みたいな構文が存在するんですかね...?