Open1

'operator' の記述順序について

log5log5

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;
}

プロトタイプ宣言みたいな構文が存在するんですかね...?