【问题标题】:error C4716: must return a value, thrown by function that actually does return a value错误 C4716:必须返回一个值,由实际返回值的函数抛出
【发布时间】:2015-08-23 09:27:56
【问题描述】:

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

我有以下运算符重载:

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

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

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

【问题讨论】:

  • &gt;&gt;&gt; masterMapOfBugs['Visual Studio Compilation Error C4716 but the function does return'] == 'Missing bracket somewhere'
  • 我已将 Vector 类的定义添加到我的问题中。
  • 我想对我的问题投反对票是由于 Vector 的任务定义,如果不是,我很乐意听到如何进一步改进我的问题。

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


【解决方案1】:

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

为了描述我是如何得出这个结论的,我特化了 Vector 的操作符函数:

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

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

【讨论】:

  • 这个答案不被接受,因为我只能在发布日期后两天接受我自己的答案。
  • 这就是为什么你应该使用std::vector而不是一些语义被破坏的自制容器。
  • @MateuszGrzejek 我认为这是一种不同的向量。固定大小,按元素操作。
  • @juanchopanza 这只是一个名为Vectorstd::array。我很好奇为什么不能用它来代替。
  • 有趣的是,大多数人在遇到称为“向量”的东西时是如何假设容器类的。它实际上是数学意义上的向量。它针对组件类型和计数进行了模板化,只是为了减少我必须自己实现的类的数量,而是让编译器生成组件计数和数字类型的每种组合所需的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多