我正在尝试在c ++上创建简单的数学。我想使用带有epsilon的自定义浮点类型,它在编译时计算。所以我需要创建类型扣除操作。 我的代码存在问题:
namespace Math {
namespace Internal {
template<typename typeT>
struct type_value {
static typeT value_;
};
template<typename type1T, typename type2T, size_t length>
struct dot_product_type_deducator {
using value_type =
decltype(
(type_value<dot_product_type_deducator<type1T, type2T, length - 1>>::value_)
+ (type_value<dot_product_type_deducator<type1T, type2T, 1>>::value_));
};
template<typename type1T, typename type2T>
struct dot_product_type_deducator<type1T, type2T, 1> {
using value_type = decltype(type_value<type1T>::value_ * type_value<type2T>::value_);
};
}
template<typename type1T, typename type2T, size_t length>
static auto dot(const Vector<type1T, length> &vector1,
const Vector<type2T, length> &vector2) {
return std::inner_product(vector1.begin(), vector1.end(), vector2.begin(),
static_cast<typename Internal::dot_product_type_deducator<type1T, type2T, length>::value_type>(0));
}
}
当我写:
dot(Vector<int, 3>{1, 2, 3}, Vector<float, 3>{2, 3, 4})
MSVC说:
error C2676: binary '+': Math::Internal::dot_product_type_deducator<type1T,type2T,1>' does not define this operator or a conversion to a type acceptable to the predefined operator
1> with
1> [
1> type1T=int,
1> type2T=float
1> ]
还有两个错误。
答案:
我忘了写dot_product_type_deducator::value_type
。
答案 0 :(得分:0)
当你这样做时
using value_type =
decltype(
(type_value<dot_product_type_deducator<type1T, type2T, length - 1>>::value_)
+ (type_value<dot_product_type_deducator<type1T, type2T, 1>>::value_));
您将value_type
设置为您指定的类型。现在,type_value<...>::value
看起来与std::declval
非常相似,这意味着您的value_type
将等于dot_product_type_deducator
与operator+
相加的结果。但我们可以清楚地看到dot_product_type_deducator
结构,我们可以看到它没有定义operator+
,因此错误。
我不知道您正在尝试使用这些结构做什么,但如果您希望编译代码,则需要在operator+
上定义dot_product_type_deducator
。