错误 C4716:必须 return 一个值,由实际执行 return 个值的函数抛出
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;
}
很明显只有一个代码路径,这个路径也是returns一个值,但是在Visual Studio 2013下编译,我得到一个错误C4716,说明编译器实例化的函数'must return a value'。到目前为止我尝试过的所有实例化都出现了这个错误。对于同一 header 中的每个其他运算符重载,我也会收到此错误,所有这些的结构都与上面的代码片段类似。
我在这里遗漏了一些明显的东西吗?
编辑:这是模板化向量 class 定义:
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 出现错误,指出 return 值不存在合适的复制构造函数,通过从复制构造函数中删除 explicit 关键字解决了这个问题。
如果我能正确理解显式复制构造函数的工作原理,这对我来说是显而易见的。
我的问题很简单,但我无法理解它的原因,即使经过广泛研究也没有出现类似的帖子,所以这里是:
我有以下运算符重载:
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;
}
很明显只有一个代码路径,这个路径也是returns一个值,但是在Visual Studio 2013下编译,我得到一个错误C4716,说明编译器实例化的函数'must return a value'。到目前为止我尝试过的所有实例化都出现了这个错误。对于同一 header 中的每个其他运算符重载,我也会收到此错误,所有这些的结构都与上面的代码片段类似。 我在这里遗漏了一些明显的东西吗?
编辑:这是模板化向量 class 定义:
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 出现错误,指出 return 值不存在合适的复制构造函数,通过从复制构造函数中删除 explicit 关键字解决了这个问题。 如果我能正确理解显式复制构造函数的工作原理,这对我来说是显而易见的。