我目前正在尝试编写一个程序,该程序使用std::bind
std::filesystem::path
和std::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进行编译,两者都会产生类似的错误。通过搜索引擎搜索没有给出有用的结果。
答案 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