【发布时间】:2014-01-16 03:08:10
【问题描述】:
我有一个模板类,我正在为其重载operator+,但需要它可能返回与该类实例化的数据类型不同的数据类型。例如,以下 sn-p 执行 vector*vector(内积)、vector*scalar 或 scalar*vector 的标准数学定义。具体来说,假设我有一个 Vector<int> 并且标量是 double 类型——我想从“vector*scalar”operator+ 函数返回一个双精度值。
我很确定我缺少一些用于友元函数的 template<class T> 语句(?),但这个 sn-p 并不意味着编译。
template<class T>
class Vector
{
private:
std::vector<T> base;
public:
friend Vector operator*(const Vector& lhs, const Vector& rhs); // inner product
Vector<T> operator*(const T scalar); // vector*scalar
friend Vector operator*(const T scalar, const Vector& rhs); // scalar*vector
};
template<class T>
Vector<T> operator*(const Vector<T>& lhs, const Vector<T>& rhs) // inner product
{
assert( lhs.base.size() == rhs.base.size() );
Vector result;
result.base.reserve(lhs.base.size());
std::transform( lhs.base.begin(), lhs.base.end(), rhs.base.begin(), std::back_inserter(result.base), std::multiplies<T>() );
return result;
}
template<class T>
Vector<T> Vector<T>::operator*(const T scalar) // vector*scalar
{
Vector result;
result.base.reserve(base.size());
std::transform( base.begin(), base.end(), std::back_inserter(result.base), std::bind1st(std::multiplies<T>(), scalar) );
return result;
}
template<class T>
Vector<T> operator*(const T scalar, const Vector<T>& rhs) // scalar*vector
{
Vector result;
result.base.reserve(rhs.base.size());
std::transform( rhs.base.begin(), rhs.base.end(), std::back_inserter(result.base), std::bind1st(std::multiplies<T>(), scalar) );
return result;
}
【问题讨论】:
-
什么是编译器错误信息?
-
我猜你想要的是返回一个向量,其值类型是每个组件操作返回的类型,即
int * double的结果,在这个例子中是double而不是@ 987654329@。decltype可以做到这一点。