C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 模板二进制运算符重载决策大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在使用Apple LLVM编译器(XCode 4.5.2附带)时遇到了问题,同时正确运行GCC.更重要的是比关于编译器问题的辩论(我认为GCC是正确的),这引发了关于重载运算符时模板特化的解决顺序的问题[1].

一个简单的矩阵类模板< 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 11标准第13.3.1 / 2段的规定:

此外,标准成员函数中没有提到优先于非成员函数,反之亦然.

是.选择全局运算符(应该是!)的原因是它是比类中定义的函数模板更专业的模板:在模板参数推导之后,N>常量和放大器;和matrix_t< T>常量和放大器;可以使matrix_t< T>匹配常量和放大器; r,但前者比后者更专业,因此,它是优选的.

根据第13.3.3 / 1段:

因此:

此行为符合@L_489_6@.但请注意,这些不是专业化,而是重载.

最后:

我想你可以说它是一个(全局)运算符重载模板.它不是专门化,因为模板函数特化具有不同的语法.因此,没有专门的主要模板.它只是一个函数模板,一旦实例化,就会生成乘法运算符的重载.

大佬总结

以上是大佬教程为你收集整理的c – 模板二进制运算符重载决策全部内容,希望文章能够帮你解决c – 模板二进制运算符重载决策所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。