【发布时间】:2015-07-19 10:51:07
【问题描述】:
我目前正致力于实现一些数学基础运算,并尽量避免使用第三方库。我被困在重载operator* 以将Scalar*Vector 和Vector*Scalar 相乘。 Scalar*Vector的点积的当前代码:
#include <vector>
#include <type_traits>
template<class Vector, class Scalar>
typename std::enable_if<std::is_floating_point<Scalar>::value, Vector>::type operator*
(
const Scalar &a,
const Vector &b
)
{
return Vector
(
a*b[0],
a*b[1],
a*b[2]
);
}
int main()
{
const std::vector<double> v1({1,2,3});
const double s1(2);
const auto result(s1*v1);
std::cout<< result << std::endl;
}
编译器错误信息是:
error: invalid operands to binary expression ('double' and 'const std::vector')
关于如何重载* 操作符,让这两种点积都成为可能,有什么建议吗?我不打算在自定义向量类中将这两个运算符实现为重载运算符。而不是那个,我的目标是模板化操作符。
【问题讨论】:
-
顺便说一下,当至少有一种类型不是用户定义的非标准库类型时,不允许重载运算符。
-
你不需要指定
Scalar = double,它永远不会恢复你给它的;它总是会从你传递给它的参数中推断出Scalar和Vector。 -
@CoffeeandCode:谢谢,要改变它。实际上,这很有意义。
-
@KerrekSB:Vector 将是我的应用程序中的一个自定义类。只是为了这个例子,我使用了 std::vector。我应该改变它....
-
修复无关错误后,代码works for me。 (但程序仍然不正确,见上文。)
标签: c++ typetraits