Ошибка c4716 должна возвращать значение

AlisaChoi

0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

1

09.01.2017, 22:14. Показов 6669. Ответов 21

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

У меня vs 2015 c++. Необходимо создать шаблон класса для представления 2-х компонентных комплексных чисел и реализовать перегруженные операторы для всех стандартных операций и т.д.
Код класса complex.h :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#ifndef __COMPLEX_H__
#define __COMPLEX_H__
 
#include <iostream>
 
template <typename T>
class Complex
{
    template <typename U>
    friend std::istream& operator >> (std::istream&, Complex<U>&);
 
public:
    explicit Complex(const T& re, const T& im);
    Complex(const Complex& other);
 
    Complex& operator=(const Complex& other);
 
    T real() const { return _re; }
    T imaginary() const { return _im; }
 
    Complex conjugate() const { return Complex(_re, -_im); }
 
    Complex& operator+= (const Complex& other);
    Complex& operator-= (const Complex& other);
    Complex& operator*= (const Complex& other);
    Complex& operator/= (const Complex& other);
 
    Complex operator+ (const Complex& other);
    Complex operator- (const Complex& other);
    Complex operator* (const Complex& other);
    Complex operator/ (const Complex& other);
 
private:
    T _re;
    T _im;
};
 
template <typename T>
inline Complex<T>::Complex(const T& re, const T& im)
    : _re(re), _im(im)
{
}
 
template <typename T>
inline Complex<T>::Complex(const Complex& other)
    : _re(other._re), _im(other._im)
{
}
 
template <typename T>
Complex<T>& Complex<T>::operator=(const Complex<T>& other)
{
    if (&other == this)
        return;
 
    _re = other._re;
    _im = other._im;
 
    return *this;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator+= (const Complex<T>& other)
{
    _re += other._re;
    _im += other._im;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator-= (const Complex<T>& other)
{
    _re -= other._re;
    _im -= other._im;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator*= (const Complex<T>& other)
{
    _re = _re * other._re - _im * other._im;
    _im = _im * other._re + _re * other._im;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator/= (const Complex<T>& other)
{
    _re = (_re * other._re - _im * other._im) /
        (other._re * other._re + other._im * other._im);
    _im = (_im * other._re - _re * other._im) /
        (other._re * other._re + other._im * other._im);
}
 
template <typename T>
inline Complex<T> Complex<T>::operator+ (const Complex<T>& other)
{
    return Complex<T>(*this) += other;
}
 
template <typename T>
inline Complex<T> Complex<T>::operator- (const Complex<T>& other)
{
    return Complex<T>(*this) -= other;
}
 
template <typename T>
inline Complex<T> Complex<T>::operator* (const Complex<T>& other)
{
    return Complex<T>(*this) *= other;
}
 
template <typename T>
inline Complex<T> Complex<T>::operator/ (const Complex<T>& other)
{
    return Complex<T>(*this) /= other;
}
 
template <typename T>
std::istream& operator >> (std::istream& in, Complex<T>& c)
{
    return in >> c._re >> c._im;
}
 
template <typename T>
std::ostream& operator<< (std::ostream& out, const Complex<T>& c)
{
    return out << c.real() << " " << c.imaginary();
}
 
#endif //__COMPLEX_H__

При запуске вылетает с ошибками:
1. Ошибка C4716 Complex<int>::operator+=: должна возвращать значение (67)
2. Ошибка C4716 Complex<int>::operator-=: должна возвращать значение (74)
3. Ошибка C4716 Complex<int>::operator*=: должна возвращать значение (81)
4. Ошибка C4716 Complex<int>::operator/=: должна возвращать значение (90)

Понятно, что он хочет return , но чего и зачем непонятно…
Помогите, пожалуйста…



0



2439 / 1838 / 405

Регистрация: 15.12.2013

Сообщений: 8,208

09.01.2017, 22:30

2

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

Понятно, что он хочет return , но чего и зачем непонятно…
Помогите, пожалуйста…

Если вам return не нужен, то поставьте void и ничего не возвращайте.



0



IGPIGP

Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

10.01.2017, 01:22

3

Лучший ответ Сообщение было отмечено AlisaChoi как решение

Решение

C++
1
2
3
4
5
6
7
template <typename T>
inline Complex<T>& Complex<T>::operator+= (const Complex<T>& other)
{
    _re += other._re;
    _im += other._im;
return *this;////// :)
}



1



AlisaChoi

0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

10.01.2017, 21:49

 [ТС]

4

Если вам return не нужен, то поставьте void и ничего не возвращайте.

Он все равно просил return..

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

C++
1
2
3
4
5
6
7
template <typename T>
inline Complex<T>& Complex<T>::operator+= (const Complex<T>& other)
{
    _re += other._re;
    _im += other._im;
return *this;////// :)
}

Спасибо за помощь) Заработало! Буду добавлять остальные запросы для этой проги)



0



Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

10.01.2017, 21:52

5

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

Заработало!

Сам люблю этот момент.)
Рад, что помог. Пишите.



0



AlisaChoi

0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

11.01.2017, 23:05

 [ТС]

6

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

Пишите.

Вопрос все же возник при добавлении разнообразия в прогу. Сравнение на равенство прошло хорошо, а вот с вычислением модуля (а далее преобразование по формуле Эйлера) пошло как-то не очень.
Для модуля можно ж использовать как

C++
1
2
template <typename T>
 Complex<T> abs(const Complex<T>& _ComplexNum)

так и

C++
1
2
3
4
    float abs() // Модуль комплексного числа
    {
        return sqrt(_re * _re + _im * _im);
    }

Но он требует задать или сам модуль или корень.
А каким образом это можно прописать с оператором? Или вообще каким образом это выявляется?



0



2439 / 1838 / 405

Регистрация: 15.12.2013

Сообщений: 8,208

11.01.2017, 23:42

7

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

Для модуля можно ж использовать как

Вы сравните возвращаемые значения.
В одной — float, в другой — Complex<>.

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

А каким образом это можно прописать с оператором? Или вообще каким образом это выявляется?

Что вы понимаете под словом «это». Сформулируйте свои вопросы так, чтобы было понятно о чем речь.



0



0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

11.01.2017, 23:55

 [ТС]

8

Цитата
Сообщение от S_el
Посмотреть сообщение

Что вы понимаете под словом «это». Сформулируйте свои вопросы так, чтобы было понятно о чем речь.

Пардон. Мне не понятно как объявить модуль, как его записать..
И как лучше его подавать: одним полноценным или через корень..



0



IGPIGP

Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

12.01.2017, 00:01

9

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

Пардон. Мне не понятно как объявить модуль, как его записать..
И как лучше его подавать: одним полноценным или через корень..

Поскольку такого оператора нет то можно:

C++
1
2
3
4
template <typename T>
T Complex<T>::modulus(){
return pow(_re * _re + _im * _im, 0.5);
}

или в этом роде
#include <cmath>



1



S_el

2439 / 1838 / 405

Регистрация: 15.12.2013

Сообщений: 8,208

12.01.2017, 00:02

10

AlisaChoi, одним полноценным шаблоном, возвращающим тип double.

C++
1
return sqrt(_re * _re + _im * _im);

раз это шаблон-член, то аргумент можно и не передавать.
Или напишите отдельный класс куда поместите все необходимые шаблоны-функций.



1



AlisaChoi

0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

12.01.2017, 17:54

 [ТС]

11

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

C++Выделить код

C++
1
2
3
4
5
6
7
8
1
2
3
4
template <typename T>
T Complex<T>::modulus(){
return pow(_re * _re + _im * _im, 0.5);
}

Простите за безграмотность, но выпадает ошибка C2039 modulus: не является членом «Complex<T>»
Как объявить modulus и исправить данную ошибку?



0



IGPIGP

Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

12.01.2017, 19:04

12

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

Простите за безграмотность, но выпадает ошибка C2039 modulus: не является членом «Complex<T>»
Как объявить modulus и исправить данную ошибку?

в области класса (в public) напишите:

C++
1
T  modulus();

ну, то есть, это просто метод, а не оператор и его нужно будет вызывать на экземпляре оператором доступа (точкой) как и любой метод. А имя можно и другое придумать magnitude, например, если modulus не понравится.



0



0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

12.01.2017, 19:20

 [ТС]

13

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

в области класса (в public) напишите

Спасибо! Теперь снова заработало буду разбираться с выводом модуля и преобразованием Эйлера сейчас..
Просто во всем не очень-то бум-бум.. Поэтому легкие программы все равно идут туго и требуют долгого времени на разбирательство.. Но это до жути интересно)



0



Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

12.01.2017, 19:23

14

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

Просто во всем не очень-то бум-бум.. Поэтому легкие программы все равно идут туго и требуют долгого времени на разбирательство.. Но это до жути интересно)

Это всё ну, прямо, про меня.
Пишите.



0



AlisaChoi

0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

13.01.2017, 19:17

 [ТС]

15

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

Пишите.

И возник очередной вопрос)
Каким образом реализовать, чтобы следующий код функционировал? (Понятно, то нужно int во float переделать, а это можно вроде 3 способами, но вот как, чтобы работало — не знаю )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include "stdafx.h"
#include "complex.h"
 
int main()
{
    Complex<int> a(12, 34), b(12, -24);
    Complex<float> c;
 
    c = a;
 
    std::cout << a + b << std::endl << a - b << std::endl << a * b << std::endl << a / b << std::endl;
 
    std::cin.get();
 
    return 0;
}

Комплекс все тот же (присутствует сравнение на равенство и модуль, но значения пока не выводят)

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#ifndef __COMPLEX_H__
#define __COMPLEX_H__
 
#include <iostream>
#include <cmath>
 
template <typename T>
class Complex
{
    template <typename U>
    friend std::istream& operator >> (std::istream&, Complex<U>&);
 
 
public:
    explicit Complex(const T& re, const T& im);
    Complex(const Complex& other);
 
    Complex& operator=(const Complex& other);
 
    T real() const { return _re; }
    T imaginary() const { return _im; }
    T modulus();
 
    Complex conjugate() const { return Complex(_re, -_im); }
 
    Complex& operator+= (const Complex& other);
    Complex& operator-= (const Complex& other);
    Complex& operator*= (const Complex& other);
    Complex& operator/= (const Complex& other);
 
    
 
    Complex operator+ (const Complex& other);
    Complex operator- (const Complex& other);
    Complex operator* (const Complex& other);
    Complex operator/ (const Complex& other);
 
 
    bool operator== (Complex& other);
    bool operator!= (Complex& other);
    bool operator> (Complex& other);
    bool operator< (Complex& other);
 
bool operator > (const Complex<T>& other)
 
 
    {
        if (this->_re > other._re)
            return 1;
        else if (this->_re == other._re && this->_im > other._im)
            return 1;
        else
            return 0;
    }
 
bool operator < (const Complex<T>& other)
    {
        if (this->_re < other._re)
            return 1;
        else if (this->_re == other._re && this->_im < other._im)
            return 1;
        else
            return 0;
 
    }
 
bool operator != (const Complex<T>& other)
    {
        if (this->_re != other._re || this->_im != other._im)
            return 1;
        else
            return 0;
    }
 
bool operator == (const Complex<T>& other)
    {
        if (this->_re == other._re && this->_im == other._im)
            return 1;
        else
            return 0;
    }
 
private:
    T _re;
    T _im;
};
 
template <typename T>
inline Complex<T>::Complex(const T& re, const T& im)
    : _re(re), _im(im)
{
}
 
template <typename T>
inline Complex<T>::Complex(const Complex& other)
    : _re(other._re), _im(other._im)
{
}
 
template <typename T>
Complex<T>& Complex<T>::operator=(const Complex<T>& other)
{
    if (&other == this)
        return;
 
    _re = other._re;
    _im = other._im;
 
    return *this;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator+= (const Complex<T>& other)
{
    _re += other._re;
    _im += other._im;
 
    return *this;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator-= (const Complex<T>& other)
{
    _re -= other._re;
    _im -= other._im;
 
    return *this;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator*= (const Complex<T>& other)
{
    _re = _re * other._re - _im * other._im;
    _im = _im * other._re + _re * other._im;
 
    return *this;
}
 
template <typename T>
inline Complex<T>& Complex<T>::operator/= (const Complex<T>& other)
{
    _re = (_re * other._re - _im * other._im) /
        (other._re * other._re + other._im * other._im);
    _im = (_im * other._re - _re * other._im) /
        (other._re * other._re + other._im * other._im);
 
    return *this;
}
 
template <typename T>
T Complex<T>::modulus() {
    return pow(_re * _re + _im * _im, 0.5);
}
 
template <typename T>
inline Complex<T> Complex<T>::operator+ (const Complex<T>& other)
{
    return Complex<T>(*this) += other;
}
 
template <typename T>
inline Complex<T> Complex<T>::operator- (const Complex<T>& other)
{
    return Complex<T>(*this) -= other;
}
 
template <typename T>
inline Complex<T> Complex<T>::operator* (const Complex<T>& other)
{
    return Complex<T>(*this) *= other;
}
 
template <typename T>
inline Complex<T> Complex<T>::operator/ (const Complex<T>& other)
{
    return Complex<T>(*this) /= other;
}
 
 
template <typename T>
std::istream& operator >> (std::istream& in, Complex<T>& c)
{
    return in >> c._re >> c._im;
}
 
template <typename T>
std::ostream& operator<< (std::ostream& out, const Complex<T>& c)
{
    return out << "Re = " << c.real() << " " << "Im = "<< c.imaginary();
}
 
#endif //__COMPLEX_H__



0



IGPIGP

Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

13.01.2017, 21:24

16

AlisaChoi, возможность создавать комплексные числа на параметрах int, char, string и т.п это зло. Самый простой вариант для сложения инстансов разных типов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
template<typename T>
class Compl{
public:
T re_,im_;
Compl(T rea_, T img_):re_(rea_), im_(img_){}
 
template<typename U>
Compl& operator+(Compl<U>&);
};
 
template<typename T>
template<typename U>
Compl<T>& Compl<T>::
operator+(Compl<U>& rhs){
 
    re_+=rhs.re_;
    im_+=rhs.im_;
    return *this;
}
 
int main(int argc, char* argv[])
{
Compl<double> a(1,2);
Compl<float> b(2,3);
Compl<double>c(0,0);
c=a+b;
cout<<c.re_<<" "<<c.im_ <<endl;
system("pause");
return 0;
}

Но сложение, где первым слагаемым будет более узкий тип, будет приводить к усечению. Такое поведение интуитивно-живодерно-обрезающее и будет приводить к травмам.



0



AlisaChoi

0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

13.01.2017, 22:57

 [ТС]

17

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

Самый простой вариант для сложения инстансов разных типов

Что-то он немного вылетел у меня с ошибкой.. сначала, что

C++
1
#include "stdafx.h"

забыли.. а потом, что cout, endl и system не объявлены.
У меня вот по предложенному решению еще такой вопрос — это без отдельного класса делается, верно? Или все же

C++
1
class Compl

перенести отдельно (как делали до этого) ?



0



Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

13.01.2017, 23:00

18

Цитата
Сообщение от AlisaChoi
Посмотреть сообщение

забыли.. а потом, что cout, endl и system не объявлены.

я написал чтобы было понятно, а не чтобы было готово к употреблению. К тому же я не вижу смысла обеспечивать возможность одновременной работы инстансов класса созданных на разных типах чисел.
stdafx.h не использую, а с доступом через полное имя учитывающее пространство: std::cout и пр. не должно быть проблем. Укажите просто и всё.



1



0 / 0 / 0

Регистрация: 15.01.2016

Сообщений: 17

13.01.2017, 23:22

 [ТС]

19

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

Самый простой вариант для сложения инстансов разных типов

сначала спросила, потом сделала то о чем спросила
Заработало, если в отдельный класс все поместить..
Сейчас только переделать момент, когда одно нужно к другому приравнять. И, думаю, хватит уже мучить программу)
Пора открыть, наверное, новую тему с шарпом и ОГРОМНЕЙШИМ вопросом по еще одной программе)

Добавлено через 8 минут

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

я написал чтобы было понятно, а не чтобы было готово к употреблению.

Я это поняла, просто что-то запустила.. и из-за ошибок забыла, что вообще переделать хотела..
извиняюсь, за некомпетентность



0



IGPIGP

Комп_Оратор)

Эксперт по математике/физике

8863 / 4602 / 621

Регистрация: 04.12.2011

Сообщений: 13,742

Записей в блоге: 16

16.01.2017, 13:32

20

AlisaChoi, там невнимательно я прочёл и понаписал. Ссылку возвращают операторы +=, -+, *=, /=, инкремент, декремент, присваивание…
А простые бинарные операции возвращают новый объект:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;
template<typename T>
class Compl{
public:
T re_,im_;
Compl(T rea_, T img_):re_(rea_), im_(img_){}
 
Compl& operator+=(const Compl&);//тут ссылка возвращается
Compl operator+(const Compl&);//тут объект возвращается
 
template<typename U>
Compl operator+(const Compl<U>&);//и тут объект возвращается
};
 
template<typename T> 
Compl<T>& Compl<T>::
operator+=(const Compl& rhs){
    re_+=rhs.re_;
    im_+=rhs.im_;
    return *this;
}
 
 
template<typename T> 
Compl<T> Compl<T>::
operator+(const Compl& rhs){
Compl<T> ret(*this);
    ret.re_+=rhs.re_;
    ret.im_+=rhs.im_;
    return ret;
}
 
template<typename T>
template<typename U>
Compl<T> Compl<T>::
operator+(const Compl<U>& rhs){
Compl<T> ret(*this);
    ret.re_+=rhs.re_;
    ret.im_+=rhs.im_;
    return ret;
}
int main(int argc, char* argv[])
{
Compl<double> a(1,2);
Compl<float> b(2,3);
Compl<double>c(0,0);
c=a+b;
 
cout<<c.re_<<" "<<c.im_ <<endl;
system("pause");
return 0;
}

Простите за то, что запутал.
Если распутались, — напишите.



1



description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Compiler Warning (level 1) C4716

Compiler Warning (level 1) C4716

11/04/2016

C4716

C4716

d95ecfe5-870f-461f-a746-7913af98414b

Compiler Warning (level 1) C4716

‘function’ must return a value

The given function did not return a value.

Only functions with a return type of void can use the return command without an accompanying return value.

An undefined value will be returned when this function is called.

This warning is automatically promoted to an error. If you wish to modify this behavior, use #pragma warning.

The following sample generates C4716:

// C4716.cpp
// compile with: /c /W1
// C4716 expected
#pragma warning(default:4716)
int test() {
   // uncomment the following line to resolve
   // return 0;
}

Ваша конфиденциальность

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

Другие решения

  • Ошибка c4703 используется потенциально неинициализированная локальная переменная указатель
  • Ошибка c4700 использована неинициализированная локальная переменная
  • Ошибка c4600 kyocera 6530
  • Ошибка c46 gsxr 750
  • Ошибка c426 пежо боксер