operator-overloading 相关问题

运算符重载是编程语言的一个特性,它允许运算符的自定义实现,具体取决于所涉及的操作数的类型。有些语言允许定义新的运算符,而其他语言只允许重新定义现有的运算符。


如何重新定义Scala类型标签的操作

假设我有一个标记类型,例如:import shapeless.tag。@@ import shapeless.tag trait VolumeTag类型Volume = Double @@ VolumeTag def Volume(value:Double):Volume = tag [Volume] [Double](value )现在,...

回答 1 投票 1

Binary'[':找不到使用类型为const Stack ]的左手操作数的运算符。 我做了一个堆栈实现(使用单链表,也由我实现),当出于显示目的而试图重载“ <这是我的堆栈: template <class T> class Stack { public: LinkedList<T> stack; int Length; Stack() { Length = 0; } void Push(const T value) { stack.Add(value); Length = stack.Length; } T Pop() { T value = stack[0]; stack.Delete(0); Length = stack.Length; return value; } T operator[](const int index) { return stack[index]; } friend std::ostream& operator <<(std::ostream& os, const Stack<T>& s) { //const here causes error for (int i = 0; i < s.Length; i++) os << s[i] << " "; return os; } }; 索引操作符[]正常工作,我在main中运行了以下代码来测试堆栈: Stack<int> stack; stack.Push(10); stack.Push(5); stack.Push(11); std::cout << stack[1] << std::endl; // prints 5 as expected 但是当尝试使用std::cout << stack;打印堆栈的全部内容时,它给了我标题中提到的错误。从运算符重载中删除const关键字可解决此问题,但据我所知,传递没有const关键字不应该可变的对象不是一种好习惯。 如何在不删除const关键字的情况下使代码正常工作? 我做了一个堆栈实现(用单链表,也由我实现),当试图重载“ < <<< [ 您的operator[]是非常量的,这就是编译器抱怨的原因。 您可以添加const重载以使我正常工作: T operator[](const int index) const { return stack[index]; } 通常,元素访问应该有两个重载。对于const实例,它返回一个常量引用: const T& operator[](const int index) const { return stack[index]; // ^^ ----------- } 和返回引用的一个: T& operator[](const int index) { return stack[index]; } 您提供返回非常量引用的代码取决于您,但是由于没有operator[]的const Stack,因此出现了错误。 PS:请注意,参数上的const不是方法签名的一部分,而仅在方法内部具有含义。您可以将方法声明为T& operator[](int index),并且它将是相同的方法。这里的const仅阻止您在方法内部修改index。

<<< [

回答 2 投票 0

重载运算符+两次(内部和外部类)

为什么我可以这样做,为什么没有歧义性,为什么选择类的方法优先于其他方法?类EX {public:// ... void运算符+(const EX&ref)...

回答 1 投票 2

返回复数的基本运算

我编写了这段简短的代码,希望它很漂亮,因为我在处理基本数学运算时遇到了有趣的意外行为。从集合中导入namedtuple P = ...

回答 3 投票 1

Cout重载为多重继承而工作

我有4类,分别是Vehicle,VehicleVehicle,CargoVehicle和CrewHauler。我将绘制一个图,并将数据成员放在括号内。车辆...

回答 1 投票 0

从数字中减去一个代表矢量吗?

我试图将一个可以无限长并且在矢量中表示的数字减1。作为一个小例子:vector v1 = {5,0,0,0};从末尾减去1后,...

回答 2 投票 0

带括号的多个复合赋值语句C ++

我正在尝试通过对一个简单的类进行编码以接受两个双精度数(一个实部和虚部)的输入并对它们执行操作来学习C ++。我特别有一节,cout <

回答 2 投票 0

将对象添加到由相同类别的另一个对象指向的向量中

作为C ++任务的一部分,它旨在了解有关指针和对象的更多信息,我有一个代表家族成员的类。参数之一是向量指针“孩子”,其中应包含...

回答 1 投票 0

为什么std :: string的成员运算符=左值引用不合格

我最近了解到,成员函数可以被ref限定,这使我可以编写结构S {S&operator =(S const&)&//仅在隐式对象是左值时才可以使用...

回答 2 投票 1

如何防止赋值运算符的左侧出现临时字符

如果我为类型定义operator +,则通常使用struct S {}; S运算符+(S const&,S const&){return {}; }使用S的用户可以编写类似S s {}的代码; s + s = S {}; //呵呵来自...

回答 2 投票 0

Eigen3矩阵类别的运算符重载

这是专门关于C ++库Eigen3的。我想重载特定类型矩阵的调用运算符,因为我经常遇到以下情况:Eigen :: MatrixXd A(N,...

回答 1 投票 0

如何重载数组索引运算符的多个下标? [重复]

假设我有一堂课,让它为foo。它包含对象someclass obj [10] [10]。现在,我要引用bar,它是foo类型的对象,其方式为bar [7]等同于bar.obj [7] ...

回答 1 投票 0

在C ++中使用嵌套类模板

在下面的代码中,我有一个疑问和一个我无法解决的错误:在类BST之外定义函数root()时,为什么必须使用类型名bst :: Node *?如果不是BST ...

回答 1 投票 0

如何在Python中重载+ =?

[我试图在此代码中重载python中的+ =运算符:学生类:def __init __(self,firstname,lastname):self.firstname = firstname self.lastname = lastname self.term = 1 def ...

回答 2 投票 0

SFINAE运算符重载

我无法理解为什么以下代码无法编译。该代码段包含两个运算符和重载,一个重载用于库标头中的一些可自定义的枚举类,另一个重载于某些...

回答 1 投票 0

隐式类型转换不适用于模板类

我有两个结构A和B,因此B可以转换为A,并且我已经为A定义了operator +。结构A {float x; A(float _x):x(_x){}};结构B {float x;运算符A(){...

回答 1 投票 1

问题重载<

我目前正在尝试解决操作符重载问题,并构建了以下代码//Circle.cpp //Circle.cpp #ifndef CIRCLE_H #define CIRCLE_H #include“ IOD.cpp” #include ... ] >

回答 1 投票 0

不能在另一个类的迭代器类中使运算符<<

所以,我有ArrayList类,而在内部,我有类迭代器。我尝试了一切在迭代器类中使operator <

回答 1 投票 0

对于'map >

我什至不知道这意味着什么,我不断收到此错误“'map>类型没有可行的重载运算符[]”。错误是当我尝试打印地图“ city_Connection”时。无效行进:: get(){...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.