错误C4716:必须返回一个值,由实际返回值

时间:2015-08-23 09:27:57

标签: c++ templates c++11 operator-overloading operator-keyword

我的问题很简单,但我无法理解它的原因,即使经过广泛的研究,也没有出现类似的帖子,所以这里是:

我有以下运算符重载:

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,说明编译器实例化的函数必须返回价值&#39;。对于我迄今为止尝试过的所有实例,我都会收到此错误。我也在同一个标​​题中的每个其他运算符重载中得到此错误,所有这些错误的结构与上面的代码段类似。 我错过了一些明显的东西吗?

编辑:这是模板化的矢量类定义:

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];
    };

1 个答案:

答案 0 :(得分: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提出了一个错误,指出返回值不存在合适的复制构造函数,这是通过从复制构造函数中删除explicit关键字来解决的。 如果我能够正确理解复制构造函数的工作原理,这对我来说是显而易见的。