大佬教程收集整理的这篇文章主要介绍了c – 模板二进制运算符重载决策,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑一个简单的矩阵类模板< class T> class matrix_t,具有定义乘法结果类型的特征(带标量,矩阵或向量).这将类似于以下代码:
template <class T,class U,class Enable = void> struct matrix_multiplication_Traits { //typedef typename boost::numeric::conversion_Traits<T,U>::supertype type; typedef double type; }; template <class T,int n> struct vectorN { std::vector<T> vect; vectorN() : vect(N) { for(int i = 0; i < N; i++) vect[i] = i; } }; template <class T> class matrix_t { std::vector<T> vec; public: matrix_t<T> operator*(matrix_t<T> const& r) const { std::cout << "this_type operator*(this_type const& r) const" << std::endl; return r; } template <class U> matrix_t<typename matrix_multiplication_Traits<T,U>::type> operator*(U const &u) const { std::cout << "different_type operator*(U const &u) const" << std::endl; return matrix_t<typename matrix_multiplication_Traits<T,U>::type>(); } };
还要考虑vectorN的运算符*的特化:
template <class T,int n> //vectorN<typename matrix_multiplication_Traits<T,U>::type,N> vectorN<double,N> operator*(matrix_t<T> const&m,vectorN<U,N> const&v) { std::cout << "vectorN operator*(matrix,vectorN)" << std::endl; //return vectorN<typename matrix_multiplication_Traits<T,N>(); return vectorN<double,N>(); }
int main(int argc,const char * argv[]) { matrix_t<double> test; vectorN<double,10> my_vector; test * my_vector; // problematic line return 0; }
“有问题的行”在GCC和模板<类U>上运行全局定义的运算符*(matrix_t< T> const&,vectorN< U,N> const&). LLVM上的matrix_t< T> :: operator *(U const&)const.因此,就像matrix_t< T> :: operator *(U const&)正在捕获所有模板特化查找.一个简单的“修复”是将全局运算符*移动到矩阵类中.
我首先认为这是特质课中的一个问题,可能过于复杂或@L_489_6@(SFINAE).但即使简化特征或完全禁用它(如在粘贴代码中)也会产生@L_489_6@.然后我认为这是一个订单问题(比如Herb Shutter的文章),但是在matrix_t声明和定义之间移动全局运算符*并没有改变.
这是个问题
当然,真正的问题是模板<类U> matrix_t :: operator *(U const&)const太笼统了,但是:
>标准所涉及的这类问题是什么?
>在类中定义的运算符重载是否优先于全局定义的运算符重载?
>(更像词汇问题)运算符*的限定是什么(matrix_t< T> const&,N> const&)?模板过载运算符专业化?这更像是模板专业化还是重载功能?那个基本定义是什么?由于它本质上是一个重载的运算符,我有点迷失.
[1]我已经阅读了关于模板专业化顺序的Herb Shutter建议.
以上是大佬教程为你收集整理的c – 模板二进制运算符重载决策全部内容,希望文章能够帮你解决c – 模板二进制运算符重载决策所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。