繁体   English   中英

错误C4716:必须返回一个值,该值由实际上确实返回值的函数抛出

[英]error C4716: must return a value, thrown by function that actually does return a value

我的问题很简单,但我不了解其原因,即使经过大量研究,也没有类似的帖子出现,所以这里是:

我有以下运算符重载:

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

通过使Vector的副本构造函数非显式,为我解决了该问题。

为了描述我如何得出这个结论,我专门研究了Vector的运算符功能:

template <>
    inline Vector<int, 1> operator + (Vector<int, 1> &a, Vector<int, 1> &b) {
        Vector<int, 1> result;
        return result;
    }

Visual Studio出现一个错误,指出不存在适合返回值的副本构造函数,此错误可以通过从副本构造函数中删除显式关键字来解决。 如果我正确理解了显式副本构造函数的工作原理,这对我来说是显而易见的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM