ошибка C4716: должен возвращать значение, выданное функцией, которая действительно возвращает значение

Моя проблема довольно проста, но я не понимаю причины ее возникновения, и даже после обширных исследований не появилось ни одного подобного сообщения, поэтому вот оно:

У меня есть следующая перегрузка оператора:

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

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


По вопросам рекламы [email protected]