标签: operator-overloading

6
推荐指数
1
解决办法
2903
查看次数

增加streampos对象

我正在尝试做这样的事情:

for (std::streampos Position = 0; Position < 123; Position++)
{
    // Use Position to access something...
}
Run Code Online (Sandbox Code Playgroud)

但是,它似乎std::streampos没有operator++超载.

尝试使用Position = (Position + 1)导致以下错误:

ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
Run Code Online (Sandbox Code Playgroud)

有没有解决方法,或者我必须依靠long unsigned int足够大的文件?

c++ operator-overloading filestream

6
推荐指数
3
解决办法
4419
查看次数

在基类中重载operator delete

从C++标准(ISO/IEC 14882:2003(E)),§12.5.4,关于重载operator delete:

如果delete-expression以unary :: operator开头,则在全局范围内查找释放函数的名称.否则,如果使用delete-expression释放静态类型具有虚拟析构函数的类对象,则释放函数是在动态类型的虚拟析构函数(12.4)的定义中通过查找找到的函数.否则,如果使用delete-expression释放类T或其数组的对象,则该对象的静态和动态类型应相同,并且在T的范围内查找解除分配函数的名称.如果此查找未能找到名称,在全局范围内查找名称.如果查找结果不明确或不可访问,或者查找选择了放置重新分配功能,则程序格式错误.

§12.5.7也很有趣:

由于成员分配和释放功能是静态的,因此它们不能是虚拟的.[注意:但是,当delete-expression的cast-expression引用类类型的对象时,因为实际调用的释放函数是在作为对象动态类型的类的范围内查找的,如果是析构函数是虚拟的,效果是一样的.例如,

struct B {
    virtual ˜B();
    void operator delete(void*, size_t);
};
struct D : B {
    void operator delete(void*);
};
void f()
{
    B* bp = new D;
    delete bp; // uses D::operator delete(void*)
}
Run Code Online (Sandbox Code Playgroud)

这里,由于虚拟析构函数,D ::非数组对象的存储由D :: operator delete()释放.

看完之后,我想知道......

  • 所有主要的C++编译器(MSVC++,GCC)都完全支持这部分标准吗?
  • 如果是这样,他们是怎么做到的?隐藏虚拟功能?"特殊"虚拟析构函调用?RTTI?
  • 使用标准中的示例:如果在单独的EXE/DLL/DSO中定义了f()和D :: operator delete(),是否会出现问题?(假设所有内容都是使用相同的编译器编译的,当然)

§5.3.5.5也可能是相关的:

在第一个替代(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.在第二个备选(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义.

c++ operator-overloading

6
推荐指数
1
解决办法
2566
查看次数

为什么str不能得到第二个参数,当__str__可以?

我决定使用str来打印树状结构树的内容,使用类似的东西

print tree
Run Code Online (Sandbox Code Playgroud)

树的节点都是用户创建的类的对象,我重载他们的__str__魔术方法,以便在缩进t标签之后使用子节点的str

def __str__ (self,t=0) :`
    return t*'\t' + str(self.label) +':' +'\n'+ str(self.l,t+1)+'\n'+str(self.right,t+1)+'\n'
Run Code Online (Sandbox Code Playgroud)

但是我无法str使用该t参数调用,但我可以调用.node.__ str__(t=4)不是str,只是快捷方式的魔术方法?或者是因为解析器拒绝额外的参数str而不检查魔术方法?

PS我对行为感兴趣.我知道这不是打印树的最佳方式,它是一个黑客;)

python string methods tree operator-overloading

6
推荐指数
1
解决办法
3519
查看次数

g ++ 4.5中std :: complex的C++ 11拷贝分配 - 与'operator +'不匹配

下面的代码无法使用-std=c++0x交换机使用g ++版本4.5.0进行编译.我收到以下错误消息:

error: no match for 'operator+' in 'std::pow [with _Tp = float, _Up = int, typename __gnu_cxx::__promote_2<_Tp, _Up>::__type = double](((const std::complex<float>&)((const std::complex<float>*)(& x))), ((const int&)((const int*)(&2)))) + y'
Run Code Online (Sandbox Code Playgroud)

我认为这与此处提到的可分配要求有关.我应该为复杂定义我自己的复制赋值运算符吗?如果是这样,怎么样?

#include <complex>
using namespace std;

int main(int argc, char *argv[]) {
  complex<float> x,y;
  x = pow(x,2);      // ok
  x = x        + y;  // ok
  x = pow(x,2) + y;  // error
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading complextype c++11

6
推荐指数
1
解决办法
755
查看次数

C#相等运算符覆盖(==和!=)

可能重复:
如何在没有无限递归的情况下检查'=='运算符重载中的空值?

我有一个看起来像这样的对象:

public class Tags
{
   int mask;

   public static bool operator !=(Tags x, Tags y)
   {
      return !(x == y);
   }

   public static bool operator ==(Tags x, Tags y)
   {
      return x.mask == y.mask;
   }
}
Run Code Online (Sandbox Code Playgroud)

这适用于将实例相互比较,但我也希望能够处理如下表达式:

if(tags1 == null)
Run Code Online (Sandbox Code Playgroud)

这样做会导致以下行出现异常:

return x.mask == y.mask;
Run Code Online (Sandbox Code Playgroud)

既然ynull.

我已经尝试将此功能更改为:

public static bool operator ==(Tags x, Tags y)
{
   if (x == null && y == null) return true;
   if (x == null || y == null) …
Run Code Online (Sandbox Code Playgroud)

.net c# operator-overloading

6
推荐指数
2
解决办法
940
查看次数

使用List <T>重载C#运算符

我试图在C#中重载一个运算符(不要问为什么!)Lists.例如,我希望能够写:

List<string> x = // some list of things
List<string> y = // some list of things
List<string> z = x + y
Run Code Online (Sandbox Code Playgroud)

所以'z'包含'x'的所有内容,后跟'y'的内容.我知道已经有办法组合两个列表,我只是想了解运算符重载如何与泛型结构一起工作.

(顺便说一下,这是List班级Systems.Collections.Generic.)

c# operator-overloading

6
推荐指数
1
解决办法
4120
查看次数

对operator +和/或operator + =使用移动语义是否有意义?

我想知道在重载operator +和/或operator + =时使用移动语义是什么样的情况.即使在这个问题中解释了如何做到这一点,我也无法理解为什么要这样做.我们考虑运算符+ =.如果我只是通过引用右侧传递并在左侧对象上进行适当的更改,则无论如何都没有不必要的副本.所以我们回到同一点:在这种情况下移动语义是否有益?

c++ move operator-overloading c++11

6
推荐指数
1
解决办法
1318
查看次数

如何在C++中实现3 <= X <= 10?

我希望能够写作

if (3 <= X <= 10)
{

}
else if (20 < X < 100) 
{ //...etc
Run Code Online (Sandbox Code Playgroud)

在C++中并正确评估它.我知道你可以用Python做到这一点,我认为这是表达条件的一种非常易读的方式.

我不想写:

if (3 <= X && X <= 10) //etc.
Run Code Online (Sandbox Code Playgroud)

我怎么能用C++做到这一点?可能吗?什么会超载运营商的样子?如果没有,你能解释为什么不可能吗?

c++ operator-overloading

6
推荐指数
3
解决办法
1345
查看次数

解决运算符[]的模糊重载

我有这门课:

class MyClass {

    public:

        int operator[](const std::string&);
        const std::string& operator[](const int&) const;

    ...
};
Run Code Online (Sandbox Code Playgroud)

但是,如果我调用第二个运算符w/const literal 0,它的工作量很大:

MyClass myclass;
std::cout << myclass[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

In function 'int main()':
ambiguous overload for 'operator[]' in 'myclass[0]'
note: candidates are:
note: const int MyClass::operator[](const string&)|
note: const string& MyClass::operator[](const int&) const
Run Code Online (Sandbox Code Playgroud)

我想我明白了什么情况(0可以是字符串或int?),但我的问题是:有没有办法解决这个问题并保持运算符重载?

c++ operator-overloading operators

6
推荐指数
1
解决办法
1036
查看次数