草庐IT

compound-operator

全部标签

c++ - 如何为 std::variant 编写 operator<<?

我想写operator对于std::variant.假设是operator对于特定变体,只有在operator时才有效对变体可以包含的所有类型都有效。 最佳答案 //g++(GCC)7.2.0//g++-std=c++1z-O2-Wall-pedantic-pthreadmain.cpp#include#include#include#includetemplatestd::ostream&operator&v){std::visit([&os](auto&&arg){os>v=4;std::coutDemo这依赖于将通用lambd

c++ - std::map operator[] 中的违规读取位置

我在运行一些传给我的旧代码时遇到了问题。它在99%的时间都有效,但偶尔,我注意到它会抛出“违反读取位置”异常。我有可变数量的线程可能在整个进程的生命周期内执行此代码。低出现频率可能表明存在竞争条件,但我不知道为什么在这种情况下会导致异常。这是有问题的代码:MyClass::Dostuff(){staticmapmappedChars;if(mappedChars.empty()){for(charc='0';c在map的operator[]实现中抛出异常,在第一次调用operator[]时(使用STL的VS2005实现。)mapped_type&operator[](constkey_

c++ - 在 C++ 中重载比较运算符导致 "invalid operator<"

目前正在尝试在C++中对对象vector进行排序,每个对象包含一个字符串字符串可以包含字母或数字(由于设计限制,这是必要的,因为比较器可以更改)。此时重载对象的类,这样当比较两个对象时,比较的是它们包含的字符串。这在一定程度上起作用——但是,当我使用排序操作(例如STL排序)对对象进行排序时,它将按顺序对三个字符串(例如“1”、“4”、“12”)进行排序“1”、“12”、“4”。4大于12,但因为它从最左边的数字开始比较,所以会出现这种“不正确”的排序。我最初的react是改变我重载比较操作的方式。我会首先检查我正在比较的字符串的长度——如果字符串的内容更大或更小,这将是一个明显的迹象

c++ - 如何知道链自定义operator<<调用的次数?

我有自己的类,我可以像这样定义和使用vw&vw::operator链除了向每个链添加一个特殊的终止值(如下所示)之外,我是否还有其他选择可以知道它何时完成?instEDIT2:LogicStuff答案之后的当前解决方案:---chain.h---#pragmaonce#includeclasschain{public:chain();~chain();};---chain_cutter.h---#pragmaonce#include"chain.h"classchain_cutter{chain&inst;public:explicitchain_cutter(chain&inst):

c++ - 调用 operator() 时是否可以提供模板参数?

我想使用模板operator()但不确定是否可行。这是一个无法编译的简单测试用例。我的语法有问题吗,还是这根本不可能?structA{templatevoidf(){}templatevoidoperator()(){}};intmain(){Aa;a.f();//Thiscompiles.a.operator()();//Thiscompiles.a();//Thiswon'tcompile.return0;} 最佳答案 就像评论中提到的克里斯一样,不,不使用速记语法。您必须使用完整的.operator()()句法;

c++ - 填充 std::map 时为 "C2593: operator = is ambiguous"

我有一个std::map我正在尝试使用初始化列表进行初始化。我在两个地方以两种不同的方式这样做。第一个有效,而另一个导致标题中提到的错误。这是有效的:voidfoo(){staticstd::mapfooMap={{"First","ABC"},{"Second","DEF"}};}虽然这个没有:classBar{public:Bar();private:std::mapbarMap;};Bar::Bar(){barMap={//为什么在尝试初始化类成员时出现错误,而静态映射有效?目前,我可以通过首先创建一个局部变量然后将其与成员交换来填充成员,如下所示:Bar::Bar(){std:

C++ - 重载 operator new 并提供额外的参数

我知道您可以重载运算符new。当您这样做时,默认情况下您的方法会收到一个size_t参数。但是,是否可以将size_t参数以及用户提供的其他参数发送到重载的new运算符方法?例如inta=5;Monkey*monk=newMonkey(a);因为我想像这样覆盖新的操作符void*Monkey::operatornew(size_tsize,inta){...}谢谢编辑:这是我想要完成的:我在应用程序开始时分配了一大块虚拟内存(内存池)。继承我的基类的所有对象都将继承其重载的new运算符。我有时想在重载的new中传递一个参数的原因是告诉我的内存管理器我是否想使用内存池,或者我是否想用ma

c++ - operator new inside 命名空间

namespaceX{void*operatornew(size_t);}给出错误信息为:error:‘void*X::operatornew(size_t)’maynotbedeclaredwithinanamespace它是gcccompilerbug吗??在较旧的gcc版本中,它似乎可以正常工作。知道为什么不允许这样做吗?用例:我只想允许对类进行自定义operatornew/delete,并希望禁止全局new/operator。很容易捕获编译器错误,而不是链接器错误;所以我编码:namespaceX{void*operatornew(size_t);}usingnamespace

C++ operator() 重载 boost::system::error_code 技巧

我看到了boost实现的一个绝妙技巧,他们以某种方式使用()运算符的重载来将类boost::system::error_code的实例评估为bool值classerror_code{...typedefvoid(*unspecified_bool_type)();staticvoidunspecified_bool_true(){}operatorunspecified_bool_type()const//trueiferror{returnm_val==0?0:unspecified_bool_true;}...}这导致有可能检查这样的错误...boost::system::erro

c++ - 使用 C++11 编译 ui 代码时遇到 "unable to find string literal operator"错误

我正在使用我自己的GNUmakefile编译QTGUI应用程序(版本4)。当我将C++03标准与gcc编译器一起使用时,一切都运行良好。现在我需要C++11标准并得到错误:无法找到字符串文字运算符'operator""__FILE__'"在我的window.cpp中的以下几行connect(ui->myGLWidget,SIGNAL(xRotationChanged(int)),ui->rotXSlider,SLOT(setValue(int)));connect(ui->myGLWidget,SIGNAL(yRotationChanged(int)),ui->rotYSlider,S