int operator==(const AAA &rhs) const;
Run Code Online (Sandbox Code Playgroud)
这是一个运算符重载声明.为什么要放在const
最后?谢谢
我正在尝试做这样的事情:
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++标准(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()释放.
看完之后,我想知道......
§5.3.5.5也可能是相关的:
在第一个替代(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.在第二个备选(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义.
我决定使用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我对行为感兴趣.我知道这不是打印树的最佳方式,它是一个黑客;)
下面的代码无法使用-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) 我有一个看起来像这样的对象:
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)
既然y
是null
.
我已经尝试将此功能更改为:
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) 我试图在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
.)
我想知道在重载operator +和/或operator + =时使用移动语义是什么样的情况.即使在这个问题中解释了如何做到这一点,我也无法理解为什么要这样做.我们考虑运算符+ =.如果我只是通过引用右侧传递并在左侧对象上进行适当的更改,则无论如何都没有不必要的副本.所以我们回到同一点:在这种情况下移动语义是否有益?
我希望能够写作
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++做到这一点?可能吗?什么会超载运营商的样子?如果没有,你能解释为什么不可能吗?
我有这门课:
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?),但我的问题是:有没有办法解决这个问题并保持运算符重载?