在模板化类之外定义运算符重载
Defining Operator Overloads Outside Templated Class
当我编译以下内容时,
#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; }我收到此错误:
vector_test.cpp:49:95:错误:无效使用不完整的类型"类向量"
vector_test.cpp:7:26: 错误:"类向量"的声明
我做错了什么?
friend
函数不声明成员函数。因此,您希望将它们定义为
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
函数不是类的一部分。您不应通过Vector<T>::
说明符来定义它。正确的是:
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;
}
检查:http://ideone.com/8n9UO1
相关文章:
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 自定义运算符重载C++,无开销
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 如何使用C++将MXNET自定义运算符构建到单独的库/包中?
- 模板类的用户定义运算符上的 C++ 隐式转换
- 什么是编程语言支持定义您自己的自定义运算符?
- 如何在Qt中为矩阵类定义[ ][ ]运算符?
- 在 c++ 迭代器中,我应该同时定义运算符== 和运算符!=吗?
- 在 rxcpp 中创建自定义运算符
- 错误 C2676;在C++的二叉搜索树类中定义 ++ 运算符时遇到问题
- std::map :使用自定义运算符时更新密钥
- 最初定义运算符C++在哪里
- 如何在Tensorflow Lite中添加自定义运算符
- 如何在 rxcpp 自定义运算符中正确推断泛型
- 在模板化类之外定义运算符重载
- 为类定义之外的模板类定义运算符[]()(数组订阅)
- 是否可以在类定义之外定义运算符[]()(数组订阅)
- C++ 重新定义运算符<() 和运算符!=()
- 如何将上下文信息传递给自定义运算符<<适用于 std::iostream
- 无法在C++中定义++运算符,这里有什么问题?