在C ++中使隐式转换运算符优先于另一个

时间:2011-09-06 22:41:37

标签: c++ templates c++11 operator-precedence

我希望某个隐式转换序列优先于另一个。我有以下(大大简化)类和函数:

class Whatever {...}

template <class T>
class ref
{
    public:

        operator T* ()
        {
            return object;
        }

        operator T& ()
        {
            return *object;
        }

        T* object;
        ...
};

void f (Whatever*)
{
    cout << "f (Whatever*)" << endl;
}

void f (Whatever&)
{
    cout << "f (Whatever&") << endl;
}

int main (int argc, char* argv[])
{
    ref<Whatever> whatever = ...;
    f(whatever);
}

当我有一个ref对象并且我对f进行模糊调用时,我希望编译器选择涉及T&amp;的那个。但在其他明确的情况下,我希望隐式转换保持不变。

到目前为止,我已经尝试引入一个中间类,其中ref可以隐式转换为,并且具有隐式转换运算符到T *,因此转换序列会更长。不幸的是,它没有在明确的情况下认识到它确实可以转换为T *。当中间类有一个(n隐式)构造函数时,也会发生同样的事情。毫无疑问,这个版本与ref完全无关。

我也试过制作一个隐式转换运算符模板,结果相同。

3 个答案:

答案 0 :(得分:1)

两次转换中没有“排名”;两者都同样好,因此过载是模糊的。这是你无法改变的语言的核心部分。

但是,您可以通过明确指定转换来指定所需的重载:

f((Whatever&) whatever);

答案 1 :(得分:0)

简单:定义void f(const ref<Whatever>&),它将胜过需要转换的其他人。

答案 2 :(得分:0)

执行隐式转换时,仅应用一个用户定义的转换函数。如果没有定义的转换函数,则编译器不会查找可以转换对象的中间类型。