2017-04-15 114 views
0

我已經寫了下面的一段代碼:遞歸矢量模板

template<typename T> 
ostream& operator<<(ostream& os, const vector<T>& v) { 
    os << "{"; 
    for (auto i=v.begin(); i!=v.end(); ++i) { 
     os << *i << " "; 
    } 
    os << "}"; 
    return os; 
} 

這經常vector<int>情況下能正常工作,但我想要做的是這樣的:

vector<vector<int> > v={{1,2},{3,4}} 
cout << v; // Should print {{1 2 } {3 4 } } 

相反,我得到編譯錯誤(下面的文本,與長長的候選人名單):test.cpp|212|error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'std::vector<std::vector<int> >')|

我以爲模板函數可以使用兩次,遞歸。我錯了嗎?如果不是,是什麼給了?如果是這樣,有沒有辦法使這個通用的沒有重複的代碼?

+0

如果您不明白錯誤消息,則不建議對其進行彙總。 – Yakk

+1

提供[MCVE]。 – Yakk

回答

1
#include <iostream> 
#include <vector> 

template<class T, class A> 
std::ostream& operator<<(std::ostream& os, const std::vector<T,A>& v) { 
    os << "{"; 
    for(auto&&e:v) 
     os<<e<<" "; 
    os << "}"; 
    return os; 
} 

int main(){ 
    std::vector<int> v1{1,2,3}; 
    std::cout<<v1<<"\n"; 
    std::vector<std::vector<int>> v2{{1},{2,3}}; 
    std::cout<<v2<<"\n"; 
} 

以上編譯和運行。修復你的拼寫錯誤,或者小心你正在使用的命名空間。在除了當前命名空間或ADL相關命名空間之外的任何內容中重載運算符往往會失敗。