我可以使用绑定的流操作符吗?

时间:2014-05-26 23:49:16

标签: c++ c++11

我还在学习如何正确使用bind的c ++ 11功能。这是一个实验:

using namespace std::placeholders;
using namespace std;

struct MyType {};

ostream& operator<<(ostream &os, const MyType &n)
{
    os << n;
    return os;
}

int main()
{
    std::vector<MyType> vec;

    std::for_each(vec.begin(), vec.end(), std::bind(operator<<, std::ref(std::cout), _1));

    return 0;
}

我得到了clang编译错误:

error: no matching function for call to 'bind'
    std::for_each(vec.begin(), vec.end(), std::bind(operator<<, std::ref(std::cout), _1));

我猜绑定无法区分函数运算符&lt;&lt;在我的文件中定义的那些预定义。

但我想知道它是否真的可以完成而且我做错了?

[编辑]感谢ISARANDI,前缀::修复问题。但是在同一个命名空间我有多重函数:

using namespace std::placeholders;
using namespace std;

struct MyType {};
struct MyType2 {};

ostream& operator<<(ostream &os, const MyType &n)
{
    os << n;
    return os;
}

ostream& operator<<(ostream &os, const MyType2 &n)
{
    os << n;
    return os;
}

int main()
{
    std::vector<MyType> vec;

    std::for_each(vec.begin(), vec.end(), std::bind(::operator<<, std::ref(std::cout), _1));

    return 0;
}

在这种情况下,即使使用全局命名空间,我仍然会得到编译错误。这里有解决方案吗?

[EDIT2]好的,想通了,我需要施展它:

std::for_each(vec.begin(), vec.end(), std::bind((ostream&(ostream&, const MyType&))::operator<<, std::ref(std::cout), _1));

1 个答案:

答案 0 :(得分:8)

由于using namespace std; operator<<有多个重载。 要明确选择您的版本,请写

std::for_each(vec.begin(), vec.end(), std::bind(::operator<<, std::ref(std::cout), _1));

::前缀选择全局命名空间的重载。