模糊的隐式转换

时间:2014-10-07 20:08:23

标签: c++ operator-overloading implicit-conversion

我经常使用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>          ]

0 个答案:

没有答案