为什么std :: bind不能使用std :: filesystem :: path和std :: ostream?

时间:2018-06-01 11:41:23

标签: c++ c++11 c++17 stdbind

我目前正在尝试编写一个程序,该程序使用std::bind std::filesystem::pathstd::ostream作为参考,如下所示:

#include <functional>
#include <filesystem>
#include <ostream>
#include <iostream>

struct Buggy{
    static void something(const std::filesystem::path &path, std::ostream &out);
    void bind();
};

void Buggy::bind(){
    auto function = std::bind(&Buggy::something, std::placeholders::_1, std::cout);
    function(std::filesystem::path("./"));
}

void Buggy::something(const std::filesystem::path &path, std::ostream &out){
    out << path.string() << std::endl;
}

int main(){
    Buggy buggy;
    buggy.bind();
}

我希望这段代码只输出&#34; ./&#34;,相反,它会给我massive template errors.这是为什么?我对std::bind的使用对我来说是正确的。我在Linux上编译g++ --std=c++17 bug4.cpp -o bug4 -lstdc++fs

我无法读取模板错误,因为它们与此标准库的实现细节混杂在一起。我尝试使用clang和gcc进行编译,两者都会产生类似的错误。通过搜索引擎搜索没有给出有用的结果。

1 个答案:

答案 0 :(得分:9)

默认情况下会复制通过bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:Alice --producer --topic testtopic 绑定的参数。 std::bind是不可复制的。您需要使用std::cout

std::ref

就个人而言,我避免使用auto function = std::bind(&Buggy::something, std::placeholders::_1, std::ref(std::cout)); 而是使用lambda表达式。

std::bind