Вопросы с тегами [operator-overloading]

0

голосов
1

ответ
27

Просмотры

Оператор C ++ перегрузки [], где параметр данных для назначения?

Я хочу, чтобы добавить перегрузки оператора [] в моем классе. Перегрузка операторов не то, что я должен был сделать раньше. Я хочу написать реализацию, чтобы сделать следующее: MyClass а; а [ "тест"] = 123; INT Тест = [ "тест"]; До сих пор в моем классе прототип выглядит следующим образом: строка оператор [] (Const символ * cpszLabel); Реализация не является полной и выглядит следующим образом: строка MyClass :: оператор [] (Const символ * cpszLabel) {строка strContent; если (! cpszLabel = nullptr) {} вернуться strContent; } То, что я не уверен, о том, как ссылаться на данные, которые приписана или же это требует перегрузки «=» тоже? Я добавил перегрузку для «=» оператора, но это не дозвонились: Прототип: оператор строка = (INT intData); Реализация: строка MyClass :: Оператор = (целое intData) {символ szString [24]; Sprintf (szString, "\" % d \ "", intData); возвращенная строка (szString); }
SPlatten
1

голосов
1

ответ
39

Просмотры

Перегрузки Оператор + с двумя массивами C ++

DynamicArray DynamicArray :: Оператор + (Const DynamicArray & RHS) сопзЬ {INT кол = 0; INT tempCapcacity = mCapacity; INT newCapacity = mCapacity + rhs.mCapacity; Строка * Темп = allocateAndCopyToNewArray (Мслов, mNumWords, newCapacity); для (INT I = tempCapcacity; я <newCapacity; я ++) {темп [I] = rhs.mWords [число]; подсчитывать ++; } Вернуть * это; } Попытка иметь перегруженный оператор объединить два массива строк. Функция должна быть константной, так что я не в состоянии изменить данные членов. Как я могу вернуть этот временный массив?
Aidan Smith
1

голосов
0

ответ
33

Просмотры

Есть ли способ расширения точки (или любой другой) тип с перегруженными операторами?

В цикле, в событии OnPaint, я рисую строку, используя DrawString. Перед нанесением строки, клиент прямоугольник oRect должен быть компенсирован некоторыми пикселями. Находясь в цикле, то ясно, что это смещение должно быть отменено, или они будут суммироваться. Это работает как задумано: Защищенный Overrides Sub OnPaint (е Как PaintEventArgs) ... oRect.Offset (oOffset) e.Graphics.DrawString (sText, oFont, oBrush, oRect, oStringFormat) oRect.Offset (New Point (- oOffset.X , - oOffset.Y)) ... End Sub Однако, было бы гораздо лучше, чтобы отменить смещение, просто указав оператор отрицания. Конечно, я мог идти с удлинительным именем нивелирует и применить его следующим образом: oRect.Offset (Негатив (oOffset)) Тем не менее, я хотел бы сделать это: oRect.Offset (- oOffset) Попытка указать расширение в модуль для перегруженного оператора говорит мне, что я не могу применить расширения для операторов. Есть ли другой способ расширения точки (или любой другой) тип с перегруженными операторами?
Herb
1

голосов
0

ответ
121

Просмотры

Перегрузки алгебраических операторов в классе CRTP как свободные функции и возврат общего типа

моя цель состоит в том, чтобы написать вектор и матрица класса. Для класса матрицы мне нужна специализация для 2D случая. Поэтому я решил наследовать специализированные классы от класса MatrixBase. То, что я хочу, это просто реализация общей алгебры со всеми производными классами матриц. Чтобы быть более точным: я хочу, чтобы Матричные классы работать как мой класс Vector. Мой класс Vector перегружает свои операторы как функции, не являющиеся членов, как это (Вектор, умножается на скаляр): автоматический оператор шаблона * (сопзИте Vector & v1, Const T2 s2) {Вектор v (v1.size ()); для (Std :: size_t я = 0; я <v1.size (); я ++) v.get (я) = v1.get (я) * s2; вернуться V; }; Я делаю это снаружи, потому что я хочу, левую и правую боковую обработку и возвращает вектор общего типа. Теперь моя матрица базового класса реализуется как это, так что я могу наследовать все функциональные возможности для производных классов (точно так же как копировать и перемещать назначения). шаблон класса Matrix {общественности: Const Derived & оператор = (Const Производная и другие); Const Derived & оператор = (Derived && друга); }; Теперь, как я могу достичь того же функциональность как реализации вектора? Значение, возвращает объект класса Derived, но с основным общим типом Matrix2D и скалярной T2? Проблема заключается в том, что в качестве оператора-члена, я могу получить только правую руку умножения. С свободным оператором, я не могу вернуть производный класс. И как оператор друга, я бы возвращать Производный объект, который имеет типа T, а не общий тип от умножения? Кто-нибудь есть предложения? Изменить: Я не нашел решение основной проблемы пока. Я решил левую и правую операцию: шаблон класса Matrix {общественности: Производное оператор * (сопзЬ T & s) сопзЬ; Производный друг оператора * (сопзЬ Т & слева, Const Derived & справа) {вернуться вправо * влево; }}; Это решение является производным от: http://kaba.hilvi.org/pastel-1.5.0/restrict_deduction.htm Хотя я не совсем понимаю, класса удостоверений он использует в этом блоге, так как он прекрасно работает, как это. Что касается общего типа возвращаемого класса, я до сих пор не знаю, как вернуть Производный класс с базовым типом T, который отличается от текущего объекта (наследование рода не позволяет это, потому что у меня нет доступа ?!). Я также читал, что (даже) частота собственных библиотека (http://eigen.tuxfamily.org/index.php?title=Main_Page) требует операций на общих типов. Так что это возможно? Например, с помощью векторного класса, это работает: INT основной () {Vector VEC (5); авто vecMul = VEC * 0,5; станд :: соиЬ
Nyquist
1

голосов
0

ответ
45

Просмотры

Получение ошибки компилятора «двоичный„

Я получаю ошибку ниже компилятора, когда я строю свой проект: XMLHelper.h (22): C2678 ошибка: бинарная '
Raghu Ramaiah
1

голосов
2

ответ
59

Просмотры

Перегрузка операторов с использованием глубокой копии в C ++

# include # include # include используя патезрасе; класс Строка {символ * значение; INT Len; общественности: String () {Len = 0; значение = 0; } ~ String () {} Строка (символ * s) {LEN = StrLen (ы); значение = новый символ [LEN + 1]; зЬгср (значение, с); } Строка (String & s) {Len = s.len; значение = новый символ [LEN + 1]; зЬгср (значение, s.value); } Друг Строка оператора + (String obj1, Строка obj2) {Строка obj3; obj3.len = obj1.len + obj2.len; obj3.value = новый символ [obj3.len + 1]; зЬгср (obj3.value, obj1.value); strcat (obj3.value, obj2.value); вернуться obj3; } Друг Строка оператора = (String obj1, String obj2) {Строка obj3; зЬгср (obj3.value, obj1.value); strcat (obj3.value, obj2.value); вернуться obj3; } Недействительным дисплей () {соиЬ
1

голосов
1

ответ
168

Просмотры

Мне нужно, чтобы обеспечить методы литых для оператора литых перегрузок в C #, чтобы позволить людям использовать в VB делать

Я где-то читал, что старый VB .net (до VB .NET 2005?) Не мог использовать перегруженные операторы в C # класса. Это верно для перегруженных операторов отданных? В любом случае вы, ребята, думаете, что это недостаток для C # библиотеки классов не включать их и арифметические методы как фактические методы для других языков, таких как: ToDouble ToFloat FromDouble Добавить Вычтите Multiply Divide ...
Joan Venge
1

голосов
2

ответ
120

Просмотры

Parameter issue with operator overload for !=

Я пытаюсь определить перегрузку для! = Оператора. Мой код выглядит следующим образом. (Update:. Устаревший код Если один из двух указателей статьи указует на NULL, этот код будет врезаться.) Его ArticleContainer :: ArticleIterator оператор :: = (константного ArticleIterator & artit) {если (this-> статьи == NULL && artit!. статья == NULL) вернуть ложь; (! This-> article-> GetID () = artit.article-> GetID ()) еще, если возвращает истину; иначе если (this-> article-> GetName () = artit.article-> GetName (!)) возвращает истину; еще вернуться ложным; } Когда я поставил точку останова на его первой строке кода, я видел это в отладчике. это - 0x22fedc artit - Невозможно создать изменяемый объект Очевидно, функция не может получить доступ к artit, поэтому он выходит из строя. Что я делаю неправильно? Редактирование: вызов происходит здесь. для (ArticleContainer :: ArticleIterator искусство = cont.Begin (); искусство = cont.End (!); искусство ++) {соиЬ next-> статья; this-> следующая = this-> next-> рядом; }
Pieter
1

голосов
1

ответ
488

Просмотры

CodeDom генерировать перегрузку оператора VB.NET?

Есть ли способ использовать CodeDom для генерации перегруженного оператора в VB.NET? Я хочу, чтобы генерировать это: Public Shared оператора = (ByVal х Как MyType, ByVal у Как MyType) As Boolean Возврат х Is у End Operator Ближайший хак я могу думать, чтобы сделать это следующее: Dim эк As New CodeMemberMethod () эк .Name = "Оператор =" eq.Parameters.Add (Новый CodeParameterDeclarationExpression (Новый CodeTypeReference ( "MyType"), "х")) eq.Parameters.Add (Новый CodeParameterDeclarationExpression (Новый CodeTypeReference ( "MyType"), "у") ) eq.Attributes = MemberAttributes.Public Или MemberAttributes.Static eq.ReturnType = Новый CodeTypeReference (GetType (Boolean)) eq.Statements.Add (New CodeMethodReturnStatement (Новый CodeBinaryOperatorExpression (Новый CodeVariableReferenceExpression ( "х"), CodeBinaryOperatorType.IdentityEquality,
adam0101
1

голосов
1

ответ
36

Просмотры

Outputing объекта с помощью функции-члена класса шаблона

Я пытаюсь использовать простой выход функции шаблона класса indexedList с объектом простого класса. Я перегружен оператор вывода в классе как функции друга следующим образом: // в заголовочном файл друг ostream & операторе
ghudner
1

голосов
1

ответ
273

Просмотры

Оберните метод перегрузки оператора

Как обернуть метод, который выполняет оператор перегрузки в неуправляемом C ++ кода с использованием C ++ / CLI? Я работаю в организации, и у меня нет достаточного доступа к их исходному коду и, следовательно, не имеет много представления о том, что оператор функции перегрузки делает точно. Так есть ли способ, чтобы обернуть этот метод и не переопределить его в C ++ / CLI?
Saurabh
1

голосов
1

ответ
1.2k

Просмотры

Qt сериализации. QDataStream и оператор

Имея MyClass: QPolygonF Я хотел бы создать пустое bin_write (QDataStream & из) сопзЬ {из
Poul K. Sørensen
1

голосов
1

ответ
425

Просмотры

Объяснение для оператора

Я пытаюсь понять, как оператор перегружает работу. Я хочу, чтобы закодировать его так, что я могу написать Войти (Log :: LEVEL_ERR)
kotoko
1

голосов
1

ответ
403

Просмотры

Странный способ перегрузки оператора разыменования из BoostCon разговора

Я наблюдал за boostcon разговор на YouTube под названием «Введение в методы Современные C ++ (Часть I)». Примерно минуты 22 говорящие показывает класс, который перегружает оператор разыменования. шаблонный класс pointer_wrapper {общественности: pointer_wrapper (): value_ (0) {} явно pointer_wrapper (Т * р): (! CheckingPolicy :: check_pointer (value_)) value_ (р) {} оператор T * () {если {вернуться BadPointerPolicy :: handle_bad_pointer (value_); } Еще {вернуть value_; }} Частные: T * value_; }; Я никогда не видел такой способ перегрузки оператора разыменования. Почему там нет типа возврата и почему T появляется после «оператора» ключевого слова? Я всегда думал, что путь к перегрузке этого оператора было так: T & оператор * () {// ...
Jonas Tepe
1

голосов
1

ответ
175

Просмотры
1

голосов
1

ответ
407

Просмотры

Перегруженный оператор «

У меня есть пользовательский интерфейс с QTableView, который, в свою очередь, использует QStandardItemModel для своих данных. Поскольку некоторые из моих данных Числовой, я подклассы в QStandardItem реализовать свое собственное сравнение. За Документы, нужно только переопределить "
easythrees
1

голосов
1

ответ
1.7k

Просмотры

Перегрузки операторов В шаблоне класса (Linked List)

Примечание: Это Домашнее задание В частности мой вопрос с оператором присваивания +, я пишу односвязан список шаблоны и должен создавать операторы + =, +, -, [] ЭСТ. Я написал массив, и + = до сих пор не в большей части вопроса, но теперь им работать над оператором + в настоящее время у меня есть ... Queue.h #ifndef QUEUE_H #define QUEUE_H #include // # включить «UnderGrad.h "// # включить "" класс шаблон #include #include Queue Grad.h {класс Node {Queue класса друга; частные: T * данные; Узел * следующий; }; общественности: Очередь () {головы = NULL; Хвост = NULL; numNodes = 0;} ~ Очередь () {ясно ();} // перегруженные операторы Т & оператор [] (INT); сопзЬ Т & оператор [] (INT) Const; Очередь и оператор + = (Т *); Очередь и оператор + = (& очередь); друг Queue оператор + (Queue inList, Т * tbAdded) {inList.pushBack (tbAdded); вернуться inList; } // Очередь Оператор + (Очередь, Очередь &); // Очередь и оператор - = (Т * &); // Очередь и оператор - = (Const Очередь &); // Очередь Оператор - (Т, Т & Const); // Оператор очереди - (Очередь, Const Очередь &); // Queue и оператор! (); недействительный PushBack (Т *); // приятно быть BLE, чтобы очистить все иногда вместо того, чтобы писать для цикла evertime вы хотите OT очистить список пустоты ясно (); аннулированию popFront (); BOOL пустой (); Т * спереди (); размер Int () Const; // используется в то время как физическое лицо использует создать приложение, так что вы можете вернуться назад и отредактировать prevous страницы приложения T * getPrev (T *); Т * назад (); недействительный RemoveNode (Т *); аннулированию список сортировки (); частный: узел * голова; Узел * хвост; ИНТ numNodes; }; // будет здесь с осторожностью, автоматическими переменными // поскольку это не будет создавать новый шаблон экземпляра очереди и очередь :: оператор + = (T * tbAdded) {это -> PushBack (tbAdded); вернуться * это; } Шаблон очередь и очередь :: Оператор + = (& Очередь tbAdded) {Т * темп; в то время как (tbAdded.front ()! = NULL) {температура = (T *) новый T (* (tbAdded.front ())); это -> PushBack (темп); tbAdded.popFront (); } Вернуть * это; } Шаблон Const Т & Очередь :: Оператор [] (INT индекс) сопзЬ {INT кол = 0; Узел * температура = голова; в то время как (количество <индекс && темп -> следующий! = NULL) {кол ++; Темп = темп -> следующий; } Если (количество <индекс) {станд :: КВЖД следующий -> данные; // Темп -> далее -> данные = информация; // //} // иначе если (зЬгстр (temp1.c_str (), temp2.c_str ()) == 0 && // (* (темп -> данные)). getGPA () <(* (темп -> далее -> данные)) getGPA ()) // {// Информация = Темп -> данные. // Темп -> данные = темп -> далее -> данные; // Темп -> далее -> данные = информация; //} // // температура = температура -> следующий; //} // // температура = головы; //} // // // //} // сортирует Grad данные // шаблон // рядный аннулируются Queue :: список сортировки () // {// Node * температура = голова; // Град * Информация; // // для (INT I = 0; я <размер (); я ++) // {// пока (темп -> следующая) // {// станд :: строка TEMP1 = (* (Темп -> данные) ) .getCourse (); // станд :: строка temp2 = (* (темп -> далее -> данные)) getCourse ();. . // станд :: строка temp3 = (* (Темп -> данные)) getResearch (); // станд :: строка temp4 = (* (темп -> далее -> данные)) getResearch ();. // если (зЬгстр (temp1.c_str (), temp2.c_str ())> 0) // {// Информация = Темп -> данные; // Темп -> данные = темп -> далее -> данные; // Темп -> далее -> данные = информация; // //} // иначе если (зЬгстр (temp1.c_str (), temp2.c_str ()) == 0 && // зЬгстр (temp3.c_str (), temp4.c_str ())> 0) {// // Информация = темп -> данные; // Темп -> данные = темп -> далее -> данные; // Темп -> далее -> данные = информация; //} // // температура = температура -> следующий; //} // темп = головки; //} // // // //} // эти mothds я был рассматривает возможность использования для получения бонуса, но никогда не заканчивался, они не используются, когда в моем коде сейчас по крайней мере // этот метод используется, когда кнопка нажата назад так я могу идти от конца к передней части списка (так как это должно быть односвязан список это будет inneficient) // Таким образом, если у меня есть несколько вещей, то есть связанные курсы сохранены я могу вернуться назад и отредактировать их b4 я откладываю приложение шаблон T * Queue :: getPrev (T * curNode) {если (== curNode голова) {возвращение NULL; } Узел * Температура = головки; в то время как (! Темп -> следующая = curNode) {температура = темп -> следующий; } Обратки -> данные; } // если редактирование данным я нужен Acces последнего узла, с тем, чтобы иметь возможность вернуться и СПЭ узлов обратно -> переднего шаблон T * Queue :: назад () {если (хвост! = NULL) {возвращение голова -> данные; } Еще {возвращают NULL; }} // если мы решили вернуться и править нам нужно будет удалить шаблон старого узла недействительного Queue :: RemoveNode (T * tbRemoved) {Node * curNode * prevNode; curNode = головы; если (tbRemoved == голова -> данные) {голова = голова -> следующая; удалить curNode -> данные; удалить curNode; }, А - {prevNode = curNode (curNode> данные = tbRemoved!); curNode = curNode -> следующий; } PrevNode -> следующая = curNode -> следующая; удалить curNode -> данные; удалить curNode; } #Endif main.cpp #include "Queue.h" # include используя патезрас; INT основных () {Очередь IntList; Очередь intList1, intList2; INT * т; intList.pushBack ((INT *) новый INT (5)); intList.pushBack ((INT *) новый INT (10)); intList.pushBack ((INT *) новый INT (15)); intList.pushBack ((INT *) новый INT (20)); IntList + = ((INT *) новый INT (25)); соиЬ RemoveNode (Т * tbRemoved) {Узел * curNode, * prevNode; curNode = головы; если (tbRemoved == голова -> данные) {голова = голова -> следующая; удалить curNode -> данные; удалить curNode; }, А - {prevNode = curNode (curNode> данные = tbRemoved!); curNode = curNode -> следующий; } PrevNode -> следующая = curNode -> следующая; удалить curNode -> данные; удалить curNode; } #Endif main.cpp #include "Queue.h" # include используя патезрас; INT основных () {Очередь IntList; Очередь intList1, intList2; INT * т; intList.pushBack ((INT *) новый INT (5)); intList.pushBack ((INT *) новый INT (10)); intList.pushBack ((INT *) новый INT (15)); intList.pushBack ((INT *) новый INT (20)); IntList + = ((INT *) новый INT (25)); соиЬ RemoveNode (Т * tbRemoved) {Узел * curNode, * prevNode; curNode = головы; если (tbRemoved == голова -> данные) {голова = голова -> следующая; удалить curNode -> данные; удалить curNode; }, А - {prevNode = curNode (curNode> данные = tbRemoved!); curNode = curNode -> следующий; } PrevNode -> следующая = curNode -> следующая; удалить curNode -> данные; удалить curNode; } #Endif main.cpp #include "Queue.h" # include используя патезрас; INT основных () {Очередь IntList; Очередь intList1, intList2; INT * т; intList.pushBack ((INT *) новый INT (5)); intList.pushBack ((INT *) новый INT (10)); intList.pushBack ((INT *) новый INT (15)); intList.pushBack ((INT *) новый INT (20)); IntList + = ((INT *) новый INT (25)); соиЬ удалить curNode; }, А - {prevNode = curNode (curNode> данные = tbRemoved!); curNode = curNode -> следующий; } PrevNode -> следующая = curNode -> следующая; удалить curNode -> данные; удалить curNode; } #Endif main.cpp #include "Queue.h" # include используя патезрас; INT основных () {Очередь IntList; Очередь intList1, intList2; INT * т; intList.pushBack ((INT *) новый INT (5)); intList.pushBack ((INT *) новый INT (10)); intList.pushBack ((INT *) новый INT (15)); intList.pushBack ((INT *) новый INT (20)); IntList + = ((INT *) новый INT (25)); соиЬ удалить curNode; }, А - {prevNode = curNode (curNode> данные = tbRemoved!); curNode = curNode -> следующий; } PrevNode -> следующая = curNode -> следующая; удалить curNode -> данные; удалить curNode; } #Endif main.cpp #include "Queue.h" # include используя патезрас; INT основных () {Очередь IntList; Очередь intList1, intList2; INT * т; intList.pushBack ((INT *) новый INT (5)); intList.pushBack ((INT *) новый INT (10)); intList.pushBack ((INT *) новый INT (15)); intList.pushBack ((INT *) новый INT (20)); IntList + = ((INT *) новый INT (25)); соиЬ INT основных () {Очередь IntList; Очередь intList1, intList2; INT * т; intList.pushBack ((INT *) новый INT (5)); intList.pushBack ((INT *) новый INT (10)); intList.pushBack ((INT *) новый INT (15)); intList.pushBack ((INT *) новый INT (20)); IntList + = ((INT *) новый INT (25)); соиЬ INT основных () {Очередь IntList; Очередь intList1, intList2; INT * т; intList.pushBack ((INT *) новый INT (5)); intList.pushBack ((INT *) новый INT (10)); intList.pushBack ((INT *) новый INT (15)); intList.pushBack ((INT *) новый INT (20)); IntList + = ((INT *) новый INT (25)); соиЬ
1

голосов
3

ответ
89

Просмотры

что различия между возвращением ссылки или не перегрузкой операторов C ++

Я пытался выяснить, какова цель и на тип возвращаемого значения. Я имею в виду, рассмотрим следующий код, что произойдет, если я удалить и из функции перегрузки оператора. Класс Container {общественности: Int numElems; INT * данные; Контейнер (Int N): numElems (п) {данных = новый INT [numElems];} Container и оператор = (Const Container & шк) {если (! Это = & шк) {если (! Данных = NULL) удаление [] данных; numElems = rhs.numElems; Данные = новый INT [numElems]; для (INT I = 0; я
L-caesar
1

голосов
2

ответ
167

Просмотры

С ++, оператор при а = Ь. * С указателями на A, B, и С объектов в качестве входных

У меня есть три указателей на три объекта: MyClass * а = новый MyClass (...); MyClass * б = новый MyClass (...); MyClass * с = новый MyClass (...); Теперь я хочу, чтобы указать оператор в MyClass, так что я могу сделать: а = Ь * с; Так, Ь, с уже существующими крупными объектами, которые я не хочу делать какие-либо дополнительные копии. Я хочу сделать умножение и непосредственно записать результат «а». 1) Является ли это вообще возможно с C ++ операторов? 2) Может ли кто-нибудь дать мне какие-то намеки на синтаксисе? (Я немного новым для операторов ..) Благодарен за любую помощь.
1

голосов
1

ответ
368

Просмотры

C++ : Overloading subscripting operator

I'm implementing a vector, so i wanted it to behave as an array. That's the reason i tried to implement the subscripting operator but i haven't achieve the correct behavior. The implementation was something like this: template class Vector{ private: value_type ** vector ; long size ; long usedSize ; public: /.../ value_type & operator [] (long) ; // For writing. const value_type & operator [] (long) const ; // For reading. /.../ } template value_type & Vector::operator[] ( long index ) { if ( index < 0 || index > usedSize ) return out_of_range () ; else { vector[index] = new value_type () ; usedSize++ ; return *(vector[index]) ; } } template const value_type & Vector::operator[] ( long index ) const { if ( index < 0 || index > usedSize ) return out_of_range () ; else { return (*vector[index]) ; } } Then i test the behaviour of the object with this: int main (void) { Vector * v = new Vector ( 10 ) ; // Creates a vector of 10 elements. (*v)[0] = 3 ; int a = (*v)[0] ; cout
Gonzo RI
1

голосов
1

ответ
119

Просмотры

Почему я получаю недопустимое определение оператора здесь в FSharp: (~!)

Параметр Тип = | Фиксированный двойной | Free двойной исх с процентовкой m.ToString () = спичечной м с | Фиксированный v -> Sprintf "% F" v | Free v -> Sprintf "$% е" v.Value статический член м = м матч с (~!) | Фиксированный v -> v | Free v -> v Оператор я пытаюсь определить ~! вызывает ошибку, но в соответствии с http://msdn.microsoft.com/en-us/library/dd233204%28VS.100%29.aspx! является допустимым оператором префикса. (~ +) Работает нормально Специфическая ошибка FS1208 Error: Invalid определение оператора. Префикс определение оператора должны использовать допустимое имя оператора префикс. (FS1208) (SketchSolveFS)
bradgonesurfing
1

голосов
4

ответ
98

Просмотры

Объясните, пожалуйста, что же это друг заявление означает? [Дубликат]

Этот вопрос уже есть ответ здесь: Каковы основные правила и идиомы для перегрузки операторов? 7 отвечает друг ostream & оператор
user2515202
1

голосов
1

ответ
116

Просмотры

Перегрузки [], но его результат не решает до взаимодействия с другими операторами (C ++)

У меня есть объект данных, который я пытаюсь получить всех операторов, работающих с. Это одна порция данных с переменной PTRS в нее, и имеет любое количество различных типов и размеров и этажерки. Типы обрабатываются с перечислениями и шаблонами и выписками переключателей. Таким образом, для каждого х, д [х] является одним из типов, с любым числом из них, и они могут быть векторами. так д [х] [у] и д [х] [у] [г]. Я сделал внутренний объект помощника, чтобы помочь с этим. Так что я [] перегружен, чтобы сделать что-то вроде этого, и он будет возвращать правильный тип штраф: (ССАГПЗ 4.6.1) [Edit: У меня такая же проблема с г (х, у, г) - проблема ISN «т [] и оператор] Int I = D [0] [3] [5]; Я перегружать T () в этом вспомогательном объекте. Шаблон данных :: хелпер :: оператор Т (); // переключатель (х) ... возвращать различные типы данных :: хелперов данных :: оператор [] (INT I); // рекурсия, возвращение помощник (т, д, х, I, J); Так что я просто вернуть этот объект, который разрешает это тип в этой точке (переключатель со случаями, привязанных к t-> получить <символ> (d, х, I, J), и т.д.). Так что проблема, если я хочу сделать что-нибудь, как этот INT I = d [0] [1] + d [4] [2]; если (д [5] [1]! = D [3] [0]) ... тогда я в конечном итоге того, чтобы перегружать каждый оператор может принимать в этом временном объекте хелперов массива. И теперь я бег в необходимости сделать временное значение там иногда для некоторых операторов, что является болью. В принципе, я чувствую, что мне нужен оператор Т () для решения первой, до того, как компилятор пытается взять два из них, и добавить их. Я должен сделать это в любом случае для = и + = операторов, и т.д., но я хотел бы, чтобы удалить эти jazillion макросы помогают мне определить все из этих операторов. Кроме того, я чувствую, что если я мог бы перегрузить оператор Lvalue каким-то образом, Я мог не беспокоиться об операторе =. Может быть, и & () (который сейчас просто возвращает шаблонный PTR). ...? Или на самом деле, это больше того, что я имею в виду, по крайней мере, г [] = что-то, но я не получил эту работу. Я не уверен, как преобразовать ВТР любого типа этого возвращаемого значения. данные :: хелперов и данные :: оператор [] (INT I); У меня есть большая часть этой работы, но это много кода, и я думаю, что я буду иметь, чтобы добавить дополнительный, если заявление каждый доступ, чтобы сделать временный материал, который я не хочу делать. Так что же я пропустил? Редактирование: с помощью D (X, I, J) такая же, как D [х] [I] [J]. Я уверен, что я делаю, по крайней мере, начиная часть того, что используется в ссылке нм публикуемую. Проблема решение, что последний вспомогательный объект в свои данные, прежде чем он используется в заявлении. Так или иначе компилятор хочет оператор, который принимает вспомогательный объект, даже если он знает, как решить ее, когда она одна ... Я думаю. Был пару дней в перегружать каждый оператор, так что я забуду все детали. :) Но главная проблема сейчас с вещами, как это: помощник оператора + (помощник & л, помощник и г) Я хотел бы определить следующее, но это не привыкает, - то я думаю, что мои проблемы могут быть решены. Похожая история для одинарного опса ~, -, и постфикса ++ -. шаблон T оператор + (помощник & л, помощник и г) Но все это только потому, что есть что-то от о моем T (), я думаю. Большинство это ново для меня, так что я держал пари, что я что-то не хватает. Был пару дней в перегружать каждый оператор, так что я забуду все детали. :) Но главная проблема сейчас с вещами, как это: помощник оператора + (помощник & л, помощник и г) Я хотел бы определить следующее, но это не привыкает, - то я думаю, что мои проблемы могут быть решены. Похожая история для одинарного опса ~, -, и постфикса ++ -. шаблон T оператор + (помощник & л, помощник и г) Но все это только потому, что есть что-то от о моем T (), я думаю. Большинство это ново для меня, так что я держал пари, что я что-то не хватает. Был пару дней в перегружать каждый оператор, так что я забуду все детали. :) Но главная проблема сейчас с вещами, как это: помощник оператора + (помощник & л, помощник и г) Я хотел бы определить следующее, но это не привыкает, - то я думаю, что мои проблемы могут быть решены. Похожая история для одинарного опса ~, -, и постфикса ++ -. шаблон T оператор + (помощник & л, помощник и г) Но все это только потому, что есть что-то от о моем T (), я думаю. Большинство это ново для меня, так что я держал пари, что я что-то не хватает. шаблон T оператор + (помощник & л, помощник и г) Но все это только потому, что есть что-то от о моем T (), я думаю. Большинство это ново для меня, так что я держал пари, что я что-то не хватает. шаблон T оператор + (помощник & л, помощник и г) Но все это только потому, что есть что-то от о моем T (), я думаю. Большинство это ново для меня, так что я держал пари, что я что-то не хватает.
starship
1

голосов
1

ответ
534

Просмотры

копировать один объект данных другого объект тэ же типа с ++

Ну я понимаю, что это проблема, которая была написана уже и я последовал за несколько объяснений, но я до сих пор, кажется, не имеют никакой удачи. Может быть, есть объяснение, которое я не смог увидеть во время моего поиска или я делаю что-то немного не так. Я создал граф, и я пытаюсь скопировать данные из одного графа в другую графу. Это много работает. Однако у меня возникают проблемы, делая их отдельно. graph_maker temp_graph; temp_graph = kruskal_graph; для (без знака Int J = 0, J <min_edges.size (); j ++) {temp_graph.add_undirected_edge (min_edges [J] .node1, min_edges [J] .node2, min_edges [J] .edge_dist); если (check_cycle (temp_graph) == TRUE) temp_graph = kruskal_graph; еще kruskal_graph = temp_graph; } На temp_graph и kruskal_graph имеет тот же тип называется graph_maker. Когда я проводить add_undirected_edge () Функция кромки добавляется к обоим объектам. Для того, чтобы держать их отдельно, я попробовал перегрузить оператор присваивания для класса graph_maker: graphmaker & оператор = (Const graphmaker и прочее) {v_map = Other.v_map; вернуться * это; } На v_map это структура, содержащая данные, которые мне нужно. Я также попытался следующее: graphmaker & оператор = (graphmaker друга) {используя зЬй :: своп; подкачки (v_map, other.v_map); вернуться * это; } Но ни один из этих методов держат два объекта отдельно. Для обоих, когда я добавить край тем он добавляет, как для первой линии после того, как цикл. Я чувствую, что я делаю некоторые простые ошибки, но я имею трудное время выяснить, почему. Спасибо за ваш вклад. редактировать: структура вершин {вектор прил; // Стоимость края, имя назначения вершин строки; вершина (строка s) {имя = S; }}; класс graphmaker {общественности: / * graphmaker & оператор = (graphmaker другие) {используя зЬй :: своп; подкачки (v_map, other.v_map); // повторить для других переменных-членов; вернуться * это; } * / Graphmaker & оператор = (Const graphmaker & Другое) {v_map = Other.v_map; вернуться * это; } // ЬурейеЙ карты карты; карта v_map; add_vertex недействительными (строка & Const); add_directed_edge недействительными (Const строки и из, Const строки и до, стоимость с плавающей точкой); недействительный add_undirected_edge (Const строки & узел1, сопзИте строки & узел2, стоимость с плавающей точкой); make_graph недействительного (Const строки & название); };
user2427671
1

голосов
1

ответ
121

Просмотры

Оператор перегрузки в C ++

Пусть говорят, у меня есть класс: класс MyIntegers {общественности: MyIntegers (интермедиат SZ); // выделить SZ целые числа в _data и сделать некоторые дорогие вещи ~ MyIntegers (); // свободный массив INT * _data; } И этот маленький кусочек кода: INT зг = 10; MyIntegers а (С.З.), б (SZ), C (С.З.); для (INT I = 0; я
Michael M.
1

голосов
1

ответ
406

Просмотры

Operator overloads between complex numbers defined in customized classes

I have defined my own complex class float2_ in the following way class float2_ { public: float2 c; // Member functions } float2 is a CUDA struct, basically a couple of real and imaginary parts. Similarly, I have defined int2_ and double2_ classes. Now, I would like to overload the operator+ for all the possible combination of real/complex numbers and complex/complex numbers. Furthermore, in the header file I would like to use templates, to avoid explicitly declaring all those possibilities. So, what I tried is the following: // .cuh file template C operator+(const A,const B); // .cu file template float2_::float2_ operator+(const int2_::int2_,const float2_::float2_) { // implementation }; .... but this returns me the following error messages: Operator_Overloads.cu(65): error: this declaration has no storage class or type specifier Operator_Overloads.cu(65): error: invalid explicit instantiation declaration My question is *how correctly implementing operator+ overloads between all possible combinations of int, float, double, int2_, float2_ and double2_? Note that I cannot "templetize" the implementation since different combinations of number additions will have different implementations. Thank you very much. EDIT - PROVISIONAL SOLUTION FOLLOWING THE SUGGESTIONS BY DIETMAR KUEHL // Include file template T2 operator+(T0, T1); // --- Translational unit // --- Auxiliary function add --- complex/complex BB::float2_ add(const BB::int2_ a, const BB::float2_ b) { BB::float2_ c; c.c.x = (float)a.c.x + b.c.x; c.c.y = (float)a.c.y + b.c.y; return c; }; // --- Template definition of operator+ template T2 operator+(T0 o0, T1 o1) { return add(o0, o1); } // --- Instantiation of operator+ template BB::float2_ operator+(BB::int2_, BB::float2_); EDIT 2 - WORKING SOLUTION // --- Include file template struct result_type; template struct result_type { typedef BB::float2_ type; }; template typename result_type::type operator+(T0, T1); // --- Translational unit BB::float2_ add(const BB::int2_ a, const BB::float2_ b) { BB::float2_ c; c.c.x = (float)a.c.x + b.c.x; c.c.y = (float)a.c.y + b.c.y; return c; }; BB::float2_ operator+(BB::int2_ a, BB::float2_ b) { return add(a, b); }; BB is the namespace wherein the complex types are defined.
JackOLantern
1

голосов
1

ответ
151

Просмотры

перегрузка соиЬ без каких-либо определенного пользователя вещей в основном в C ++

может я перегрузка COUT? просто использовать один и тот же код в главном здесь, используя патезрас; INT основных () {соиЬ
user2756494
1

голосов
1

ответ
183

Просмотры

How to overload operator= in a templated class with a dynamically sized array

I'm new to making my own template classes in C++, and after several hours of searching online for answers and toying with the function & its parameters, I've given up. I'm having run-time trouble with the following class' "=" operator: In matrix.h: template class Matrix{ datatype** element; unsigned int m,n; public: Matrix(unsigned int M, unsigned int N,datatype x){ m=M; // # of rows n=N; // # of cols element=new datatype*[m]; for(int i=0;i
Kyle McCormick
1

голосов
1

ответ
79

Просмотры

Проблема с Определение оператора друга

У меня есть проблемы с моим кодом, который имеет дело с другим> оператором, но я не могу показаться, чтобы иметь возможность это исправить. Я добавил оператор друг Его> (константный my_int & c1, константный my_int & c2); код и что я знаю, что это право, но в главном классе, где я пытался реализовать это немного неправильно, и не знаю, как исправить. # include # include с помощью патезраса; // ************************************************ ********* // Функция: my_int // Назначение: Конструктор инициализирует Вэла к й // Params: х - значение для Вала // вызовов: нет // Использует: нет // *** ************************************************** **** // my_int :: my_int (интермедиат х); // ************************************************ ********* // Функция: my_int // Назначение: Конструктор инициализирует Вэл до 0 // Params: доли не имеет // Вызовы: нет // Использует: никто //*********************************************** ********** // my_int :: my_int (); // ************************************************ ********* // Функция: my_int // Назначение: Конструктор инициализирует Вэла к й // Params: х - значение для Вала // вызовов: нет // Использует: нет // *** ************************************************** **** // my_int :: my_int (); // ************************************************ ********* // Функция: набор // Назначение: Устанавливает Вэла к й // Params: х - новое значение для VAL // вызовов: нет // Использует: нет // *** ************************************************** **** // аннулируются my_int :: набор (INT х); // ************************************************ ********************* // Функция: вход // Назначение: считывает и сохраняет значение от вх. если плавник входной поток //, затем плавник уже подключен к file.User входит // значение и попросить пользователя повторно ввести данные, если пользователь вводит // неверное значение. // Params: вх - входной поток // Вызовы: нет // Использует: IStream // **************************** ***************************************** // аннулируются my_int :: вход (IStream & вх); // ************************************************ ********************* // Функция: выход // Назначение: отображение Вэла на FOUT. если FOUT является выходным потоком // затем FOUT уже подключен к файлу // Params: FOUT - выходной поток // Вызовы: нет // Использует: ostream // ************ ************************************************** ******* // аннулируются my_int :: выход (ostream & FOUT); // ************************************************ ********* // Функция: get_int // Назначение: возвращает Вэл // Params: никто не // Calls: нет // Использование: нет // ****************************** **************************** // ИНТ my_int :: get_int () // *********** ********************************************** // Функция: is_prime // Назначение: объект Num содержит действительное положительное значение // возвращает истину, если Num простое; в противном случае // возвращает ложный // Params: Num - значение, которое будет проверяться на штрих // Вызовов: SQRT // Пользу: CMATH // ******************** ************************************* // BOOL is_prime (Const my_int & Num); класс my_int {общественности: my_int (интермедиат х); my_int (); недействительными набор (INT х); недействительным вход (IStream & ая); недействительными выход (ostream & FOUT) Const; INT get_int () Const; друг BOOL оператор> (Уст my_int & c1, Const my_int & c2); частные: INT вал; }; BOOL is_prime (Const my_int & Num); INT основных () {my_int значение1; value1.input (CIN); value1.output (соиЬ); если (is_prime (значение1)) соиЬ
user2977562
1

голосов
1

ответ
466

Просмотры

C ++ оператор перегрузки

У меня есть вектор указателей, и я пытаюсь перегрузить оператор ostream, чтобы сделать печать проще. Тем не менее, я не могу показаться, чтобы получить функцию, которая будет вызвана. Вот мой код: СТД :: вектор множество; для (INT I = 0; я <sets.size (); я ++) {станд :: соиЬ
Lucas
1

голосов
1

ответ
185

Просмотры

возникли проблемы перегрузки

так что я работаю над программой класса фракции, и у меня немного трудности перегрузки оператора вывода. соответствующий бит основного файла. Const фракция FR [] = {фракции (4, 8), фракция (-15,21), фракция (10), фракция (12, -3), фракция (), фракция (28, 6), фракция (0, 12)}; для (INT I = 0; г <7; я ++) {COUT
Ggnome
1

голосов
2

ответ
567

Просмотры

c++ overloading operator+ and dynamic memory allocation

У меня есть задание написать класс, который динамически распределяет 2D-массив, то я должен написать функции для работы с ним. Одной из функций является функцией от перегрузки оператора +. Все работает, как и следовало ожидать, даже + функции оператора, пока программа не вызывает деструктор. Деструктор имеет простую работу освобождения памяти, выделенной ранее. Я знаю, что код правильно, и я проверил это вручную, но когда компьютер вызывает эту функцию в конце программы, я получаю «Необработанное исключение в 0x000566E1 в 2DArray.exe: 0xC0000005: Access места чтения нарушения 0xFEEEFEF2.» Я перепробовал все виды вещей, я сидел на этой проблеме в течение двух дней, и теперь я исчерпал. Его из-за этого пятницу. Если кто-то может попытаться помочь, я был бы признателен. Вот эти две функции, которые я думаю, что проблема утопает в. Кроме того, обратите внимание, что, когда нет деструктора, программа полностью работает хорошо, но я должен убедиться, что память освобождается, прежде чем программа завершает работу, свою часть задания. Square_Matrix Square_Matrix :: Оператор + (Square_Matrix & объект) {Square_Matrix сумма; sum.Set_Size (размер); для (INT I = 0; я <размер; я ++) {для (Int B = 0, б <размер, б ++) {sum.Set_Elem ((матрица [I] [B] + object.Get_Elem (я, б)) , я, б); }} Вернуть сумму; } Square_Matrix :: ~ Square_Matrix () {// деструктор // освободить выделенную память, если (размер> 0) {для (целое d = 0, г <размер; d ++) {удалить [] матрицу [D]; } Удалить [] матрицу; размер = 0; }} но я должен убедиться, что память освобождается, прежде чем программа завершает работу, свою часть задания. Square_Matrix Square_Matrix :: Оператор + (Square_Matrix & объект) {Square_Matrix сумма; sum.Set_Size (размер); для (INT I = 0; я <размер; я ++) {для (Int B = 0, б <размер, б ++) {sum.Set_Elem ((матрица [I] [B] + object.Get_Elem (я, б)) , я, б); }} Вернуть сумму; } Square_Matrix :: ~ Square_Matrix () {// деструктор // освободить выделенную память, если (размер> 0) {для (целое d = 0, г <размер; d ++) {удалить [] матрицу [D]; } Удалить [] матрицу; размер = 0; }} но я должен убедиться, что память освобождается, прежде чем программа завершает работу, свою часть задания. Square_Matrix Square_Matrix :: Оператор + (Square_Matrix & объект) {Square_Matrix сумма; sum.Set_Size (размер); для (INT I = 0; я <размер; я ++) {для (Int B = 0, б <размер, б ++) {sum.Set_Elem ((матрица [I] [B] + object.Get_Elem (я, б)) , я, б); }} Вернуть сумму; } Square_Matrix :: ~ Square_Matrix () {// деструктор // освободить выделенную память, если (размер> 0) {для (целое d = 0, г <размер; d ++) {удалить [] матрицу [D]; } Удалить [] матрицу; размер = 0; }} объект) {Square_Matrix сумма; sum.Set_Size (размер); для (INT I = 0; я <размер; я ++) {для (Int B = 0, б <размер, б ++) {sum.Set_Elem ((матрица [I] [B] + object.Get_Elem (я, б)) , я, б); }} Вернуть сумму; } Square_Matrix :: ~ Square_Matrix () {// деструктор // освободить выделенную память, если (размер> 0) {для (целое d = 0, г <размер; d ++) {удалить [] матрицу [D]; } Удалить [] матрицу; размер = 0; }} объект) {Square_Matrix сумма; sum.Set_Size (размер); для (INT I = 0; я <размер; я ++) {для (Int B = 0, б <размер, б ++) {sum.Set_Elem ((матрица [I] [B] + object.Get_Elem (я, б)) , я, б); }} Вернуть сумму; } Square_Matrix :: ~ Square_Matrix () {// деструктор // освободить выделенную память, если (размер> 0) {для (целое d = 0, г <размер; d ++) {удалить [] матрицу [D]; } Удалить [] матрицу; размер = 0; }} 0) {для (целого d = 0, г <размера; d ++) {удалить [] матрицу [D]; } Удалить [] матрицу; размер = 0; }} 0) {для (целого d = 0, г <размера; d ++) {удалить [] матрицу [D]; } Удалить [] матрицу; размер = 0; }}
glina126
1

голосов
2

ответ
397

Просмотры

Вы можете наложить объект приоритет для перегруженных операторов в Python?

Скажем, у меня есть два класса Python, которые определяют как надстройку и Радд перегруженных оператора, и добавить один экземпляр одного класса в другой экземпляр другого класса. Выбираются реализация зависит от порядка, в котором добавлены элементы (Python ищет метод добавления на LHS первого, и т.д.). Возможно ли для меня, чтобы определить приоритет, на котором реализация объекта-х является предпочтительным? Я хочу, чтобы, например, что Радд вызывается ОРЗ, если его приоритет выше, чем у LHS. Я действительно хочу сделать это для всех перегруженных операторов, поэтому более общее решение, что я в конце концов, после того, как. [Править: добавлен пример] Например, я могу иметь класс пользовательского типа номера, и я мог бы пожелать, чтобы молча напечатанный материал Интс к моему пользовательскому типу. Поэтому мне нужно добавить и Радд (и все другие операторские перегрузки со своими двоюродными братьями «R»). Следующий, Я хочу, чтобы общий полиномиальный класс, коэффициенты которого являются некоторым общим типом номера. Я также хочу, чтобы типаж вещи полиномов, поэтому я реализую добавлять и Радд функции для него. Однако, если добавить пользовательский номер на левом с и полиномом справа, я хочу, чтобы это было типаж до полинома вместо Python пытается типаж его до нестандартного типа номера. Таким образом, я хочу радда называться вместо оного.
JeremyKun
1

голосов
2

ответ
69

Просмотры

What is the pythonic way of extracting (& removing) a slice from a list? Or… What is the “inverse” of the slice+=list operator - python

Я знаю, как вставить список в список "срез + = список" ... мастер = [0,1,2,3,7,8,9] мастер [: 4] + = [4,5,6] # вставить 4,5,6 (грубо) обратное этой операции является удаление ломтик 4: 7 из списка, я попытался: извлеченный = дель мастер [4: 7] Но это дает ошибку синтаксиса «SyntaxError: неверный синтаксис». Точно так же обратный срез оператора «- =» не появляется существовать. В качестве решения проблемы я использовал следующее: экстрагируют = мастер [4: 7]; дель мастер [4: 7] Эти "работает" и "извлеченный" является subslice удалена из "хозяина", например, печать Dict (мастер = мастер, извлеченный = извлеченный) Выход: { 'экстрагирует': [4, 5, 6 ], 'мастер': [0, 1, 2, 3, 7, 8, 9]} есть лучший / Pythonic / простой способ? В частности, я не люблю повторяться [4: 7]: извлеченный = мастер [4: 7]; дель мастер [4: 7]» Из-за возможные побочные эффекты: например, извлеченным = мастер [randint (0,3): randint (7,10)]; дель мастер [randint (0,3): randint (7,10)] т.е. следующий читает гораздо лучше, и будет иметь никаких "побочных эффектов" ... извлеченный = дель мастер [randint (0,3): randint ( 7,10)] Любые намеки? Есть кусочек «- =» оператор я мог бы использовать, чтобы инвертировать действие среза «+ =» оператор?
NevilleDNZ
1

голосов
1

ответ
72

Просмотры

Оператор Перегрузка без шаблонов [закрыто]

В C ++ новичка до сих пор, мой опыт работы с перегрузкой был ограничен для копирования, оператор присваивания перемещения и также I операторов потока / вывода. Теперь я должен создать итератор для класса узла дерева синтаксического анализа, а это значит, что я должен перегружать следующее: == * (оператор разыменования) ++ -> = я обыскивал интернет, а также несколько книг на C ++, но до сих пор я ничего не подходит к моему конкретному случаю (то есть без ссылки на шаблоны), однако у меня есть узнать, что операторы инкремента и декремента нужно перегружен «дважды» для обоих постфиксу и префиксов случай Может кто-то пожалуйста, объясните, как можно было бы сделать это как а также рассуждения позади Спасибо :) Я извиняюсь, если я быть не по теме.
1

голосов
2

ответ
48

Просмотры

Можно ли перегружать оператор вставки >> принимать в пользовательский ввод без использования массивов? [закрыто]

Я написал программу, которая принимает входные данные от пользователей и добавляет целые числа вместе (может быть очень большим). Моя программа работает прекрасно, мне удалось сделать это достичь цели, я хочу его. Но было интересно, если это было возможно перегрузить оператор >> (это происходит на входе от пользователя) без обработки ввода в виде массива. станд :: IStream и оператор >> (станд :: IStream и модули, тест & т) {строка Num; Int А; ины >> Num; для (INT I = 0; г <num.length (); я ++) {а = Num [I] - '0'; // Здесь ясно я обрабатывать строку как массив это // возможно сделать это без обработки его как массив? t.append (а); } Вернуться модули; }
user98289
1

голосов
3

ответ
1.7k

Просмотры

Присвоение списка инициализаторов

Код ниже минимальный пример моей проблемы. Я создал простой шаблонный класс, содержащий массив фиксированного размера, и перегруженный оператор присваивания, чтобы принять любой класс, определяющий размер методов () и начать () (например, initializer_lists). Я не понимаю, почему г ++ не в состоянии решить мой призыв к этому оператору (я использую GCC 4.6):. *** ЦПД: В функции «Int основной ()»:. *** CPP: 46: 22 : ошибка:. не подходит для 'оператора =' в 'а = {42, -1.0e + 0, 3.14158999999999988261834005243144929409027099609375e + 0}' *** каст: 46: 22: Примечание: кандидаты:. *** каст: 23: 8: Примечание: шаблон A :: самостоятельно и оператор A :: = (U & Const) [с U = U, T = двойной, без знака Int N = 3u, A :: = A себя] *** CPP: 8. : 7: внимание: & A :: = оператор (Const &) *** CPP:. 8: 7: примечание:. нет известного преобразования для аргумента 1 из '' до 'сопзЬ A &' *** CPP: 8: 7 : примечание: & A :: оператор = (A && .) *** каст: 8: 7: Примечание: не известно преобразование для аргумента 1 из «» до «A» && Первый кандидат перечислен правильно, но нет сообщений об ошибке связана. Вот код: #include #include #include // ------------------------------------- ----------------------------------- шаблон класса А {общественности: ЬурейеЕ А я; // По умолчанию т е р А () {} // Копирование шаблона т е р А (Const U & другое) {оператор = (другой); } // Assignemnt шаблон самостоятельно и оператор = (U & Const друга) {если (other.size () == N) станд :: copy_n (other.begin (), N, m_data); вернуться * это; } // содержимое дисплея недействительным печати () сопзЬ {для (без знака я = 0; я <N; ++ я) станд :: соиЬ "Первый кандидат перечислен правильно, но нет никакого сообщения об ошибке связано. Вот код: #include #include #include // ------------------------------------- ----------------------------------- шаблон класса А {общественности: ЬурейеЕ А я; // По умолчанию т е р А () {} // Копирование шаблона т е р А (Const U & другое) {оператор = (другой); } // Assignemnt шаблон самостоятельно и оператор = (U & Const друга) {если (other.size () == N) станд :: copy_n (other.begin (), N, m_data); вернуться * это; } // содержимое дисплея недействительным печати () сопзЬ {для (без знака я = 0; я <N; ++ я) станд :: соиЬ "Первый кандидат перечислен правильно, но нет никакого сообщения об ошибке связано. Вот код: #include #include #include // ------------------------------------- ----------------------------------- шаблон класса А {общественности: ЬурейеЕ А я; // По умолчанию т е р А () {} // Копирование шаблона т е р А (Const U & другое) {оператор = (другой); } // Assignemnt шаблон самостоятельно и оператор = (U & Const друга) {если (other.size () == N) станд :: copy_n (other.begin (), N, m_data); вернуться * это; } // содержимое дисплея недействительным печати () сопзЬ {для (без знака я = 0; я <N; ++ я) станд :: соиЬ #include #include #include // ------------------------------------------ ------------------------------ шаблон класса А {общественности: ЬурейеЕ А я; // По умолчанию т е р А () {} // Копирование шаблона т е р А (Const U & другое) {оператор = (другой); } // Assignemnt шаблон самостоятельно и оператор = (U & Const друга) {если (other.size () == N) станд :: copy_n (other.begin (), N, m_data); вернуться * это; } // содержимое дисплея недействительным печати () сопзЬ {для (без знака я = 0; я <N; ++ я) станд :: соиЬ #include #include #include // ------------------------------------------ ------------------------------ шаблон класса А {общественности: ЬурейеЕ А я; // По умолчанию т е р А () {} // Копирование шаблона т е р А (Const U & другое) {оператор = (другой); } // Assignemnt шаблон самостоятельно и оператор = (U & Const друга) {если (other.size () == N) станд :: copy_n (other.begin (), N, m_data); вернуться * это; } // содержимое дисплея недействительным печати () сопзЬ {для (без знака я = 0; я <N; ++ я) станд :: соиЬ Оператор = (U & Const друга) {если (other.size () == N) станд :: copy_n (other.begin (), N, m_data); вернуться * это; } // содержимое дисплея недействительным печати () сопзЬ {для (без знака я = 0; я <N; ++ я) станд :: соиЬ Оператор = (U & Const друга) {если (other.size () == N) станд :: copy_n (other.begin (), N, m_data); вернуться * это; } // содержимое дисплея недействительным печати () сопзЬ {для (без знака я = 0; я <N; ++ я) станд :: соиЬ
Sheljohn
1

голосов
1

ответ
70

Просмотры

Defining operation between different types with templates

Я создал шаблон класса (так называемый ThreeVector) и дополнительные функциональные возможности, чтобы позволить операцию сложения между различными типами. Вот соответствующая часть моего файла заголовка: шаблонный класс ThreeVector {частное: T х; T мой; Т М.З.; общественности: ThreeVector (Т, Т, Т); Оператор шаблона ThreeVector + (Const ThreeVector &); } Шаблон ThreeVector :: ThreeVector (Т х, Т у, Т г) {// инициализация вектора х = х; моя = у; М.З. = г; } Шаблон шаблон ThreeVector ThreeVector :: оператор + (сопзЬ ThreeVector & а) {ThreeVector v (х + a.mx, мой + a.my М.З. + a.mz); вернуться V; } И тогда я называю это так: ThreeVector а (1,2,3); ThreeVector б (4,5,6); ThreeVector с = а + Ь; Это дает мне ошибку: ThreeVector.h: В функции члена «ThreeVector ThreeVector :: Оператор + (Const ThreeVector &) [с Х = поплавка, Т = двойной]: ThreeVectorTest.cxx: 33: инстанцирован здесь ThreeVector.h: 8: ошибка: 'плавать ThreeVector :: м х' является частным ThreeVector.h: 122: Ошибка : в этом контексте ThreeVector.h: 9: ошибка: 'плывут ThreeVector :: мой' является частным ThreeVector.h: 123: ошибка: в этом контексте ThreeVector.h: 10: ошибка: 'плывут ThreeVector :: М.З.' является частным ThreeVector .h: 124: ошибка: в этом контексте марка: *** [ThreeVectorTest] ошибка 1 Это хорошо работает, если оба а и Ь. Любая идея, почему это происходит? в этом контексте ThreeVector.h: 10: ошибка: «плывут ThreeVector :: М.З.» частная ThreeVector.h: 124: ошибка: в этом контексте марка: *** [ThreeVectorTest] Ошибка 1 Это отлично работает, если оба а и Ь , Любая идея, почему это происходит? в этом контексте ThreeVector.h: 10: ошибка: «плывут ThreeVector :: М.З.» частная ThreeVector.h: 124: ошибка: в этом контексте марка: *** [ThreeVectorTest] Ошибка 1 Это отлично работает, если оба а и Ь , Любая идея, почему это происходит?
mcglashan
1

голосов
1

ответ
90

Просмотры

COUT экземпляр в его функции конструктора

Я знаю, это может показаться странным, и способы там обойти this.but мне просто интересно, если это возможно в C ++. класс Item {общественности: имя строки; Пункт (строка ввода) {имя = вход соиЬ
C19
1

голосов
2

ответ
611

Просмотры

Перегрузка операторов присваивания с шаблонами - C ++

Я новичок здесь (на самом деле это мой первый вопрос здесь) и ищу некоторую помощь с программой, я работаю для моего класса структур данных. Речь идет о перегрузке оператора =, + и
teleton11

Просмотр дополнительных вопросов