没有来自' const value_type'的已知转换to' const void *'第一个参数

时间:2018-01-16 16:21:12

标签: c++ xcode c++11 c++14

我试图使用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;
}

1 个答案:

答案 0 :(得分:0)

std::set的迭代器是一个常量双向迭代器(至少从C ++ 11开始)。因此,它的解除引用会导致对set元素/键的持续引用(您可能不会直接修改set键,这是有道理的,因为它会破坏底层数据结构 - 通常是某种形式的搜索树)。此引用表示常量lvalue参数,该参数可能未绑定到非const引用类型的参数(p中的operator<<)。正如其他人已经建议的那样,使用const引用作为参数。