首页 > 解决方案 > 重载解析规则中更专业化模板的意义

问题描述

最近我发布了这个问题:在 clang 上的歧义运算符重载,由于与在混合成员和非成员二元运算符时,clang 错误地报告歧义而被关闭?

在阅读了其他问题的答案后,我想我仍然对更专业的含义感到困惑。因此,根据我在那里读到的内容,我的代码中的成员运算符应该解决这个问题:

template <class U>
TVector3<T>& TVector3<float>::operator*=(const U ) { return *this; }

在名称查找过程中,为了重载解析,我会得到这两个候选者:

template <class U>
TVector3<T>& operator*=(TVector3<float>&, const U ) { return *this; }

template <typename T>
TVector3<T>& operator*=(TVector3<T>& v, const TMatrix3<T>& ) { return v; }

为什么他们都同样专业化?

是因为在第一个重载中第一个参数更专业,而在第二个重载中第二个参数更专业?所以基本上他们之间的关系?

另一方面,如果我将operator*=Vector 类的成员转换为自由函数,则重载决议集将是:

template <class T, class U>
TVector3<T>& operator*=(TVector3<T>& v, const U ) { return v; }

template <typename T>
TVector3<T>& operator*=(TVector3<T>& v, const TMatrix3<T>& ) { return v; }

在这种情况下,两个重载的第一个参数同样特化,但第二个重载的第二个参数更加特化,因此在这种情况下没有歧义。

我的理解正确吗?

标签: c++templatesoperator-overloading

解决方案


推荐阅读