![](/img/trans.png)
[英]Overload of operator<< not found when called from std::ostream_iterator?
[英]std::ostream_iterator does not find operator<<
我已經聲明了一個operator<<
for std::pair<int, int>
:
std::ostream& operator<<(std::ostream& o, const std::pair<int, int>& p) {
o << p.first << p.second;
return o;
}
我想在打印數據時使用此運算符:
std::vector<std::pair<int, int>> data;
std::copy(data.begin(), data.end(), std::ostream_iterator<std::pair<int, int>>(std::cout, "\n"));
但是編譯器說, no match for operator<<
......我做錯了什么?
std::copy
無法在std
命名空間中找到operator <<
for std::pair
重載。 有沒有什么好辦法,超載operator <<
從對象std
從算法的命名空間std
命名空間。
您可以將std::for_each
與functor一起使用,它將打印您的值,例如使用lambda。
std::for_each(data.begin(), data.end(), [](const std::pair<int, int>& p)
{
std::cout << p << std::endl;
});
您無法在std命名空間中進行重載,因此您只能為用戶定義的類型添加特殊化
如果C ++程序向命名空間std或命名空間std中的命名空間添加聲明或定義,則該行為是未定義的,除非另有說明
只有當聲明取決於用戶定義的類型並且特化符合原始模板的標准庫要求且未明確禁止時,程序才可以將任何標准庫模板的模板特化添加到命名空間std。
也許你可以試試這個 :
struct PAIR : std::pair<int, int>
{
using std::pair<int, int>::pair;
};
int main(int argc, char* argv[]) {
std::vector<std::pair<int, int>> data;
std::copy(data.begin(), data.end(), std::ostream_iterator<PAIR>(std::cout, "\n"));
return 0;
}
由於已有一個很好的答案,我將簡單引用鏈接:
問題是名稱查找找不到你的運算符<<(ostream&os,const PAIR&r)。 嘗試調用operator <<的代碼位於ostream_iterator <>內部的某個位置,該位置本身位於std命名空間內。 名稱查找在ostream_iterator <>和std名稱空間內查找正確的函數; 參數依賴查找在這里沒有幫助,因為這兩個參數也在std命名空間中。
所以,我的建議是(1)要么將你的運算符包裝到命名空間std {},那就是UB,IIRC。 或者(2)創建一個繼承自std :: pair的結構,以在命名空間中定義一個新類型,並使用ADL查找運算符<<()。
用法:
#include <iostream>
#include <limits>
#include <vector>
#include <iterator>
#include <map>
std::ostream& operator<<(std::ostream& o, const std::pair<int, int>& p) {
o << p.first << p.second;
return o;
}
struct PAIR : std::pair<int, int>
{
using std::pair<int, int>::pair;
};
int main(int argc, char* argv[]) {
std::vector<std::pair<int, int> > data;
data.push_back(std::pair<int, int>(50, 42));
std::copy(data.begin(), data.end(), std::ostream_iterator<PAIR>(std::cout, "\n"));
return 0;
}
谷歌搜索的一般情況帶您了解具體案例......
請注意,如果名稱為N的類型為T,要使用ostream_iterator +副本組合,則運算符<< for T需要位於名稱空間N而不是::。
namespace N {
class T;
std::ostream & operator << ( std::ostream &; T const & );
}
在這種情況下,std :: copy可以找到你的define N :: operator <<(std :: ostream&; T const&)
使用運算符時,無需擔心限定訪問權限。
N::T t;
std::cout << t << std::endl;
和
std::list<N::t> alist;
alist.push_back(t);
std::ostream_iterator<N::t> out_itr(std::cout, "\n");
std::copy(alist.begin(), alist.end(), out_itr);
std::vector<std::pair<int, int> > data;
std::copy(data.begin(), data.end(), std::ostream_iterator<std::pair<int, int> >(std::cout, "\n"));
請試試這個,我覺得有有之間的空間>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.