我试图使用std :: cout打印一组对,但它没有编译。我在XCode 9上使用C ++ 14.错误发生在cout<<(*it);
行
错误:二进制表达式的操作数无效(&#39; ostream&#39;(又名&#39; basic_ostream&#39;)和&#39; const value_type&#39;(又名&#39; const std :: __1 ::对&#39;))
候选功能不可行:没有来自&#39; const value_type&#39; (又名&#39; const std :: __ 1 :: pair&#39;)to&#39; const void *&#39;第一个论点;使用&amp;
获取参数的地址#include <iostream>
#include <set>
#include <map>
using namespace std;
template <class P, class Q> ostream& operator<<(ostream &out, pair<P,Q>& p)
{
cout<<"["<<p.first<<","<<p.second<<"]";
return out;
}
template <class T> ostream& operator<<(ostream &out, set<T> &S)
{
cout<<"{";
for(typename set<T>::iterator it = S.begin(); it != S.end(); it++) {
cout<<(*it); //Error occurs here
if(next(it,1) != S.end()) cout<<",";
}
cout<<"}";
return out;
}
int main() {
set<pair<int,int>> s;
s.insert({1,2});
cout<<s;
return 0;
}
答案 0 :(得分:0)
std::set
的迭代器是一个常量双向迭代器(至少从C ++ 11开始)。因此,它的解除引用会导致对set元素/键的持续引用(您可能不会直接修改set键,这是有道理的,因为它会破坏底层数据结构 - 通常是某种形式的搜索树)。此引用表示常量lvalue参数,该参数可能未绑定到非const引用类型的参数(p
中的operator<<
)。正如其他人已经建议的那样,使用const
引用作为参数。