c++ - 第一个参数没有从 'const value_type' 到 'const void *' 的已知转换

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

我正在尝试使用 std::cout 打印一组对,但它没有编译。我在 XCode 9 上使用 C++14。错误发生在 cout<<(*it);线

错误:二进制表达式的无效操作数('ostream'(又名'basic_ostream')和'const value_type'(又名'const std::__1::pair'))

候选函数不可行:第一个参数没有从“const value_type”(又名“const std::__1::pair”)到“const void *”的已知转换;用 & 取参数的地址

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

最佳答案

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

关于c++ - 第一个参数没有从 'const value_type' 到 'const void *' 的已知转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48285661/

相关文章:

c++ - 使用 cv_image 实现 dlib pyramid_up

c++ - 与 C++ 中的 numpy.random.choice 等效的函数

c++ - std::atomic 变量的比较操作线程安全吗?

c++ - 在 C++ 中初始化数组

c++ - 奇怪的 constexpr typeid 错误

c++ - 没有命名类型错误(使用全局类)

objective-c - 了解协议(protocol)和子类化

c++ - Xcode 复制文件构建阶段 - "Destination"选项是什么意思?

xcode - 使用git时如何解决冲突?

c++ - "long int", "long long"数据类型