草庐IT

c++ - 传递 std::ofstream 作为参数时,为什么我要生成 "use of deleted"函数?

这个问题在这里已经有了答案:Whycopyingstringstreamisnotallowed?(3个答案)C++copyastreamobject(5个答案)关闭7年前。我有一个成员是std::ofstreamfBinaryFile和一个voidsetFile(std::ofstream&pBinaryFile){fBinaryFile=pBinaryFile;}输出:Data.h:86:16:error:useofdeletedfunction‘std::basic_ofstream&std::basic_ofstream::operator=(conststd::basic_o

c++ - 为 std::unordered_map 中的 const std::reference_wrapper 重载 operator==

我不知道如何使用std::reference_wrapper将std::string引用获取到std::unordered_map中>。根据以下链接,我知道我需要重载operator==。Whycantemplateinstancesnotbededucedin`std::reference_wrapper`s?但是,我不知道如何编写operator==以使其采用conststd::reference_wrapper。如果包装器不是const,那将不是问题。使用char而不是std::string效果很好(不需要重载operator==)。代码:#include#include#inc

c++ - 固定大小的容器到可变参数模板参数列表的转换

我必须调用一个可变模板函数,它可以接受任意数量的参数。templatevoidf(Args&...args);我想写一个小的包装函数,这样我就可以用固定大小的容器(如std::array)中包含的N个相同类型的参数调用f。目标是写类似的东西std::arrayarr={1,2,3};wrapper(arr);//callsf(1,2,3);我尝试使用初始化列表和std::forward的某种组合,但无济于事。有没有办法实现我想要的? 最佳答案 如果您的编译器支持C++14,您可以按以下方式进行:templatevoidf(Args&

c++ - 将指针 vector 转换为对象 vector

我有这个vector:std::vectorfoo;我有一个具有以下签名的函数(我无法更改它):voidbar(std::vectorconst&);如何以最少的更改将foo传递给该函数?我目前的做法是:std::vectoranother_bar(bar.size());std::transform(std::begin(bar),std::end(bar),std::begin(another_bar),[](T*item){return*T;});我认为这里发生了很多不必要的复制。编辑:T不是模板化参数。它是一个特定的类型。 最佳答案

c++ - 无法将 unique_ptr 添加到 std::array

在书籍和网上搜索之后,直到我的耳朵之间开始剧烈疼痛,我无法弄清楚如何将std::unique_ptr添加到std::array.以下是类成员:std::array,MAX_ELMS_NUM>m_collection;在.cpp文件中,我试图将填充在std::unique_ptr中的新媒体指针添加到数组中:Media*newMedia=CreateNewMedia(Mediainfostuff);unique_ptrnp(newMedia);m_collection[0]=np;除了最后一行之外的所有内容都可以编译。 最佳答案 最后一

c++ - 如何判断一个类是否实现了 != 运算符重载?

给定以下函数:templatestaticboolequals(conststd::vector&a,conststd::vector&b){if(a.size()!=b.size())returnfalse;for(size_ti=0;i我如何确定给定的T是否覆盖!=运算符?如果有人在不重载的情况下使用类型,它可能最终会使用简单的二进制比较,这可能会默默地导致错误的结果。所以我想确保只有拥有自己的!=运算符重载的类才能在这里使用。 最佳答案 [更新1-提升“半”解决方案]我意识到,如果您的类具有转换运算符(允许!=比较的类型),我

c++ - 为什么 std::function 没有 function_type 或等效的成员类型?

来自here在我看来std::function没有function_type或等效的成员类型导出用于初始化它的实际类型。它有result_type,argument_type,以及first_argument_type和second_argument_type,但与上述类型完全不同。为什么它不提供这种类型作为其接口(interface)的一部分?肯定会有一个很好的理由,但我不知道是什么原因,所以我很想知道。因为我知道第一个问题是为什么需要它,好吧,想象一下我想做类似std::is_same::value的事情在sfinae评估中检查它们的基础类型是否相同,只要符号相同,它们包含不同的功

c++ - 使用智能指针编写安全的复制构造函数

我想弄清楚是否有可能在std::unique_ptr的帮助下编写一个安全的复制构造函数里面。这是我的代码:#include#includeclassA{public:A():_a(10){std::cerr_a(newA(*tmp.a));std::unique_ptr_b(newB(*tmp.b));a=_a.release();b=_b.release();}~C(){std::cerr这段代码的输出:A()constructorB()constructorC()constructorC()copyconstructorA()copyconstructorB()copyconstr

c++ - std::cout 将 uint8_t 作为字符处理

如果我运行这段代码:std::cout(65);它会输出:A这是数字65的ASCII等价物。这是因为uint8_t被简单地定义为:typedefunsignedcharuint8_t;这种行为是标准的吗?定义uint8_t保证作为数字而不是字符来处理不是更好的方法吗?我无法理解如果我想打印uint8_t变量的值,它将被打印为一个字符的逻辑。附言我正在使用MSVS2013。 最佳答案 Isthisbehaviorastandard行为是标准的,因为如果uint8_t是unsignedchar的typedef,那么它将始终打印一个字符为

c++ - 将跨字节数组内容提取到 std::bitset

我需要从字节数组(std::vector)中提取内容到位集。内容可能跨越两个字节。这是我的单元测试:std::vectorval={0xAB,0xCD,0xEF};//is101010111100110111101111std::bitseta=extractToBitSet(val,0);//shouldbe0x0A:1010std::bitsetbc=extractToBitSet(val,4);//shouldbe0xBC:10111100std::bitsetdef=extractToBitSet(val,12);//shouldbe0x0DEF:110111101111CPP