代码之家  ›  专栏  ›  技术社区  ›  JWki

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

  •  1
  • JWki  · 技术社区  · 9 年前

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

    我有以下操作员过载:

    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,指出编译器实例化的函数“必须返回一个”。到目前为止,我尝试过的所有实例化都会出现此错误。对于同一标头中的每个其他运算符重载,我也会收到此错误,所有这些重载的结构与上面的代码段类似。 我在这里遗漏了什么明显的东西吗?

    EDIT:这是模板化的向量类定义:

    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 回复  |  直到 9 年前
        1
  •  0
  •   JWki    9 年前

    通过将Vector的复制构造函数设置为非显式,我的问题得到了解决。

    为了描述我是如何得出这个结论的,我去专门化了Vector的算子函数:

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

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