我遇到了一个优雅的行阅读一个二进制文件到一个向量,像这样(工作):
std::ifstream ifs("myfile.bin", std::ios::binary);
std::vector<char> buffer(std::istreambuf_iterator<char>(ifs), {});
相反,因为我希望向量是共享指针,所以我写:
std::ifstream ifs("myfile.bin", std::ios::binary);
auto sp = std::make_shared<std::vector<char>>(std::istreambuf_iterator<char>(ifs), {});
也就是说,只需要将向量构造函数参数传递给make_shared(就像我通常创建任何对象的共享指针时所做的那样),但是我得到:错误:没有与调用“make_shared”匹配的函数?
详细输出:
/usr/include/c++/11.1.0/bits/shared_ptr.h|873第5栏|注意:候选模板被忽略:替换失败[使用_Tp =标准::向量〈字符,标准::分配器〉]:模板参数“_Args”的导出不完整包〈std::istreambuf_iterator〈char,std::char_traits〉,(无值)〉||创建共享(_参数&&... __参数)
1条答案
按热度按时间lhcgjxsq1#
这将工作:
这是因为您使用的是可变参数模板:
其中,如果没有手动示例化,则每个参数类型都必须是可推导的。"{}"不允许参数推导,因此出现编译器错误。遗憾的是,您也可以显式示例化模板:
在这两种情况下,迭代器的类型别名可能会提高可读性(
using InputIt = std::istreambuf_iterator<char>;
或类似的东西)。