AlisaChoi 0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
||||
1 |
||||
09.01.2017, 22:14. Показов 6794. Ответов 21 Метки нет (Все метки)
У меня vs 2015 c++. Необходимо создать шаблон класса для представления 2-х компонентных комплексных чисел и реализовать перегруженные операторы для всех стандартных операций и т.д.
При запуске вылетает с ошибками: Понятно, что он хочет return , но чего и зачем непонятно…
0 |
2441 / 1839 / 406 Регистрация: 15.12.2013 Сообщений: 8,218 |
|
09.01.2017, 22:30 |
2 |
Понятно, что он хочет return , но чего и зачем непонятно… Если вам return не нужен, то поставьте
0 |
IGPIGP Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
||||
10.01.2017, 01:22 |
3 |
|||
Сообщение было отмечено AlisaChoi как решение Решение
1 |
AlisaChoi 0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
||||
10.01.2017, 21:49 [ТС] |
4 |
|||
Если вам return не нужен, то поставьте void и ничего не возвращайте. Он все равно просил return..
Спасибо за помощь) Заработало! Буду добавлять остальные запросы для этой проги)
0 |
Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
|
10.01.2017, 21:52 |
5 |
Заработало! Сам люблю этот момент.)
0 |
AlisaChoi 0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
||||||||
11.01.2017, 23:05 [ТС] |
6 |
|||||||
Пишите. Вопрос все же возник при добавлении разнообразия в прогу. Сравнение на равенство прошло хорошо, а вот с вычислением модуля (а далее преобразование по формуле Эйлера) пошло как-то не очень.
так и
Но он требует задать или сам модуль или корень.
0 |
2441 / 1839 / 406 Регистрация: 15.12.2013 Сообщений: 8,218 |
|
11.01.2017, 23:42 |
7 |
Для модуля можно ж использовать как Вы сравните возвращаемые значения.
А каким образом это можно прописать с оператором? Или вообще каким образом это выявляется? Что вы понимаете под словом «это». Сформулируйте свои вопросы так, чтобы было понятно о чем речь.
0 |
0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
|
11.01.2017, 23:55 [ТС] |
8 |
Что вы понимаете под словом «это». Сформулируйте свои вопросы так, чтобы было понятно о чем речь. Пардон. Мне не понятно как объявить модуль, как его записать..
0 |
IGPIGP Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
||||
12.01.2017, 00:01 |
9 |
|||
Пардон. Мне не понятно как объявить модуль, как его записать.. Поскольку такого оператора нет то можно:
или в этом роде
1 |
S_el 2441 / 1839 / 406 Регистрация: 15.12.2013 Сообщений: 8,218 |
||||
12.01.2017, 00:02 |
10 |
|||
AlisaChoi, одним полноценным шаблоном, возвращающим тип double.
раз это шаблон-член, то аргумент можно и не передавать.
1 |
AlisaChoi 0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
||||
12.01.2017, 17:54 [ТС] |
11 |
|||
C++Выделить код
Простите за безграмотность, но выпадает ошибка C2039 modulus: не является членом «Complex<T>»
0 |
IGPIGP Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
||||
12.01.2017, 19:04 |
12 |
|||
Простите за безграмотность, но выпадает ошибка C2039 modulus: не является членом «Complex<T>» в области класса (в public) напишите:
ну, то есть, это просто метод, а не оператор и его нужно будет вызывать на экземпляре оператором доступа (точкой) как и любой метод. А имя можно и другое придумать
0 |
0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
|
12.01.2017, 19:20 [ТС] |
13 |
в области класса (в public) напишите Спасибо! Теперь снова заработало буду разбираться с выводом модуля и преобразованием Эйлера сейчас..
0 |
Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
|
12.01.2017, 19:23 |
14 |
Просто во всем не очень-то бум-бум.. Поэтому легкие программы все равно идут туго и требуют долгого времени на разбирательство.. Но это до жути интересно) Это всё ну, прямо, про меня.
0 |
AlisaChoi 0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
||||||||
13.01.2017, 19:17 [ТС] |
15 |
|||||||
Пишите. И возник очередной вопрос)
Комплекс все тот же (присутствует сравнение на равенство и модуль, но значения пока не выводят) Кликните здесь для просмотра всего текста
0 |
IGPIGP Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
||||
13.01.2017, 21:24 |
16 |
|||
AlisaChoi, возможность создавать комплексные числа на параметрах int, char, string и т.п это зло. Самый простой вариант для сложения инстансов разных типов:
Но сложение, где первым слагаемым будет более узкий тип, будет приводить к усечению. Такое поведение интуитивно-живодерно-обрезающее и будет приводить к травмам.
0 |
AlisaChoi 0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
||||||||
13.01.2017, 22:57 [ТС] |
17 |
|||||||
Самый простой вариант для сложения инстансов разных типов Что-то он немного вылетел у меня с ошибкой.. сначала, что
забыли.. а потом, что cout, endl и system не объявлены.
перенести отдельно (как делали до этого) ?
0 |
Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
|
13.01.2017, 23:00 |
18 |
забыли.. а потом, что cout, endl и system не объявлены. я написал чтобы было понятно, а не чтобы было готово к употреблению. К тому же я не вижу смысла обеспечивать возможность одновременной работы инстансов класса созданных на разных типах чисел.
1 |
0 / 0 / 0 Регистрация: 15.01.2016 Сообщений: 17 |
|
13.01.2017, 23:22 [ТС] |
19 |
Самый простой вариант для сложения инстансов разных типов сначала спросила, потом сделала то о чем спросила Добавлено через 8 минут
я написал чтобы было понятно, а не чтобы было готово к употреблению. Я это поняла, просто что-то запустила.. и из-за ошибок забыла, что вообще переделать хотела..
0 |
IGPIGP Комп_Оратор) 8915 / 4676 / 626 Регистрация: 04.12.2011 Сообщений: 13,909 Записей в блоге: 16 |
||||
16.01.2017, 13:32 |
20 |
|||
AlisaChoi, там невнимательно я прочёл и понаписал. Ссылку возвращают операторы +=, -+, *=, /=, инкремент, декремент, присваивание…
Простите за то, что запутал.
1 |
I am struggling to get an appropriate return for this operator (it is not my code, just trying to correct it and I am not as good as I should be in C++ to correct it) can anybody help me with this, it is datatype class defined for high level design of digital circuits.
How to return this temp
without an error, is there any special approach to this?
inline friend std::ostream& operator << ( std::ostream& os, const sc_float &v)
{
if (c_DEBUG) std::cout << "debug: operator << called " << endl; //debug
// fixme - this is only copy of sc_float2double function
double temp;
temp = (double)v.man / exp2(m_width);
temp += 1.0;
temp *= exp2((double)v.exp - exp2((double)e_width - 1.0) + 1.0);
temp *= (v.sign == true ? -1.0 : 1.0);
//os << "(" << v.sign << " , " << v.exp << " , " << v.man << ")"; // debug
os << temp;
}
as I add there return os;
I got 226 errors which points to systemC library and instances there. Has anybody done declaration of stream operator with regards to systemC classes or have anybody idea how it is done?
My problem is quite simple, yet I fail to understand the cause of it and no similiar posting has turned up even after extensive research so here it is:
I have the following operator overload:
template <class T, size_t size>
inline Vector<T, size> operator + (Vector<T, size> &a, Vector<T, size> &b) {
Vector<T, size> result;
for (auto i = 0; i < size; ++i) {
result[i] = a[i] + b[i];
}
return result;
}
Obiously there’s only a single code path, and this path also returns a value, but compiling under Visual Studio 2013, I get an error C4716, stating that the function instantiated by the compiler ‘must return a value’. I get this error for all instantiations I’ve tried so far. I also get this error for every other operator overload in the same header, all of which are structured similarly to the snippet above.
Am I missing something obvious here?
EDIT: This is the templated vector class definition:
template <class T, size_t size>
struct Vector {
explicit Vector(T value = static_cast<T>(0)) {
for (auto i = 0; i < size; ++i) {
_data[i] = value;
}
}
explicit Vector(const Vector &other) {
for (auto i = 0; i < size; ++i) {
_data[i] = other._data[i];
}
}
explicit Vector(T values[size]) {
for (auto i = 0; i < size; ++i) {
_data[i] = values[i];
}
}
T & operator = (const Vector &other) {
for (auto i = 0; i < size; ++i) {
_data[i] = other._data[i];
}
return *this;
}
T & operator [] (size_t index) {
return _data[index];
}
T _data[size];
};
Моя проблема довольно проста, но я не понимаю причины ее возникновения, и даже после обширных исследований не появилось ни одного подобного сообщения, поэтому вот оно:
У меня есть следующая перегрузка оператора:
template <class T, size_t size>
inline Vector<T, size> operator + (Vector<T, size> &a, Vector<T, size> &b) {
Vector<T, size> result;
for (auto i = 0; i < size; ++i) {
result[i] = a[i] + b[i];
}
return result;
}
Очевидно, что существует только один путь к коду, и этот путь также возвращает значение, но при компиляции в Visual Studio 2013 я получаю ошибку C4716, утверждающую, что функция, созданная компилятором, «должна возвращать значение». Я получаю эту ошибку для всех экземпляров, которые я пробовал до сих пор. Я также получаю эту ошибку для всех других операторов перегрузки в том же заголовке, все из которых структурированы аналогично приведенному выше фрагменту.
Я что-то упускаю здесь очевидное?
РЕДАКТИРОВАТЬ: Это шаблонное определение векторного класса:
template <class T, size_t size>
struct Vector {
explicit Vector(T value = static_cast<T>(0)) {
for (auto i = 0; i < size; ++i) {
_data[i] = value;
}
}
explicit Vector(const Vector &other) {
for (auto i = 0; i < size; ++i) {
_data[i] = other._data[i];
}
}
explicit Vector(T values[size]) {
for (auto i = 0; i < size; ++i) {
_data[i] = values[i];
}
}
T & operator = (const Vector &other) {
for (auto i = 0; i < size; ++i) {
_data[i] = other._data[i];
}
return *this;
}
T & operator [] (size_t index) {
return _data[index];
}
T _data[size];
};
0
Решение
Проблема была решена для меня, сделав конструктор копирования Vector неявным.
Чтобы описать, как я пришел к такому выводу, я пошел и специализировал операторную функцию для Vector:
template <>
inline Vector<int, 1> operator + (Vector<int, 1> &a, Vector<int, 1> &b) {
Vector<int, 1> result;
return result;
}
В Visual Studio возникла ошибка, в которой говорится, что для возвращаемого значения не существует подходящего конструктора копирования, что было устранено путем удаления явного ключевого слова из конструктора копирования.
Это было бы очевидно для меня, если бы я правильно понял, как работают явные конструкторы копирования.
0
Другие решения
Search code, repositories, users, issues, pull requests…
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up