我希望某个隐式转换序列优先于另一个。我有以下(大大简化)类和函数:
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完全无关。
我也试过制作一个隐式转换运算符模板,结果相同。
答案 0 :(得分:1)
两次转换中没有“排名”;两者都同样好,因此过载是模糊的。这是你无法改变的语言的核心部分。
但是,您可以通过明确指定转换来指定所需的重载:
f((Whatever&) whatever);
答案 1 :(得分:0)
简单:定义void f(const ref<Whatever>&)
,它将胜过需要转换的其他人。
答案 2 :(得分:0)
执行隐式转换时,仅应用一个用户定义的转换函数。如果没有定义的转换函数,则编译器不会查找可以转换对象的中间类型。