我经常使用3d矢量长度比较来处理项目。 出于这个原因,我创建了一个sqrt类来实现比较运算符来比较平方值,而不必无缘无故地计算平方根:
template<typename source_type, typename result_type = source_type>
struct square_root_functor : std::unary_function<source_type, result_type>
{
const result_type operator() (const source_type& val) const
{
return static_cast<result_type>( std::sqrt( val ) );
}
};
template<typename source_type, typename result_type = source_type, typename sqrt_func = square_root_functor<source_type, result_type> >
class square_root_proxy
{
public:
explicit square_root_proxy( const source_type& value )
: squared_value( value )
{}
//other operators omitted for concision
bool operator<( const source_type& rhs )
{
return squared_value > rhs * rhs;
}
operator result_type()
{
return sqrt( squared_value );
}
private:
const source_type& squared_value;
sqrt_func sqrt;
};
这在大多数情况下有效但我发现了一个案例,我得到了编译器无法解决的歧义。
square_root_proxy<int> S = square_root_proxy<int>(9);
unsigned int I = 4;
bool B = S < I; //AMBIGUOUS
最后一次调用不明确,因为S
可以转换为int
,然后使用operator<(int, unsigned int)
。
或者I
可以投放到int
,然后拨打square_root_proxy<int>::operator<(int)
。
当然,显式强制转换可以解决歧义,但对用户来说却不太方便。
是否可以在这两种技术之间添加优先级,以便square_root_proxy<int>::operator<(int)
具有优先权?
由于
详细说明:
工具链:用于x86的Microsoft(R)C / C ++优化编译器版本17.00.50727
实际错误
1>main.cpp(138): error C2666: 'square_root_proxy<source_type>::operator <' : 2 overloads have similar conversions
1> with
1> [
1> source_type=int
1> ]
1> main.cpp(114): could be 'bool square_root_proxy<source_type>::operator <(const source_type &)'
1> with
1> [
1> source_type=int
1> ]
1> or 'built-in C++ operator<(int, unsigned int)'
1> while trying to match the argument list '(square_root_proxy<source_type>, unsigned int)'
1> with
1> [
1> source_type=int
1> ]