[英]Defining Operator Overloads Outside Templated Class
When I compile the following, 当我编译以下内容时,
#include <boost/numeric/ublas/vector.hpp>
#include <iomanip>
#include <stdio.h>
namespace ublas = boost::numeric::ublas;
template <class T> class Vector
{
private:
ublas::vector<T> m_ublas_vec;
unsigned m_size;
public:
Vector(unsigned s){
m_size = s;
m_ublas_vec.resize(m_size);
}
T &operator () (unsigned idx) {
if(idx >= m_size){
perror("ERROR: Index out of bounds!\n");
exit(1);
}
return m_ublas_vec(idx);
}
// Right-multiply by scalar.
template <class TT, class S>
friend Vector<TT> operator * (const Vector<TT> &, S);
// Left multiply by scalar.
template <class TT, class S>
friend Vector<TT> operator * (S, const Vector<TT> &);
};
template <class T, class S>
Vector<T> Vector<T>::operator * (const Vector<T> &v_in, S scalar){
Vector<T> v_out (v_in.m_size);
v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
return v_out;
}
template <class T, class S>
Vector<T> Vector<T>::operator * (S scalar, const Vector<T> &v_in){
Vector<T> v_out (v_in.m_size);
v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
return v_out;
}
I get this error: 我收到此错误:
vector_test.cpp:49:95: error: invalid use of incomplete type 'class Vector'
vector_test.cpp:49:95:错误:无效使用了不完整的类型'class Vector'
vector_test.cpp:7:26: error: declaration of 'class Vector'
vector_test.cpp:7:26:错误:“类Vector”的声明
What am I doing wrong? 我究竟做错了什么?
You friend
functions don't declare member functions. 您的
friend
函数不声明成员函数。 So, you want to define them as 因此,您想将它们定义为
template <class T, class S>
Vector<T> operator * (const Vector<T> &v_in, S scalar){
Vector<T> v_out (v_in.m_size);
v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
return v_out;
}
template <class T, class S>
Vector<T> operator * (S scalar, const Vector<T> &v_in){
Vector<T> v_out (v_in.m_size);
v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
return v_out;
}
friend
function is not a part of class. friend
功能不是课程的一部分。 You should not define it via Vector<T>::
specifier. 您不应通过
Vector<T>::
说明符对其进行定义。 Correct one is: 正确的一个是:
template <class T, class S>
Vector<T> operator * (const Vector<T> &v_in, S scalar){
Vector<T> v_out (v_in.m_size);
v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
return v_out;
}
template <class T, class S>
Vector<T> operator * (S scalar, const Vector<T> &v_in){
Vector<T> v_out (v_in.m_size);
v_out.m_ublas_vec = v_in.m_ublas_vec*static_cast<T>(scalar);
return v_out;
}
Check: http://ideone.com/8n9UO1 检查: http : //ideone.com/8n9UO1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.