如何强制函数参数为同一类型,不允许使用类型构造函数匹配给定的类型?

时间:2012-04-29 14:18:11

标签: c++ visual-studio-2008 visual-c++

我有点惊讶在C ++中发现这个功能,我没想到会发生这种情况。

以下是代码:

struct XY {
    int x,y;
    XY(int v) : x(v), y(v) {}
};

bool test1(const XY &pos){
    return pos.x < pos.y;
}
bool test1(int x, int y){
    return x < y;
}
void functest(){
    int val = 5;
    test1(val);
}

所以我可以调用一个带整数参数的函数,无论是否存在这样的重载,它都会使用XY类型函数,因为它有一个相同类型的构造函数!我不希望这种情况发生,我该怎么做才能防止这种情况发生?

2 个答案:

答案 0 :(得分:6)

明确XY构造函数:

explicit XY(int v) : x(v), y(v) {}

这将禁止从intXY的隐式转换,这是您调用单参数test1函数时发生的情况。

答案 1 :(得分:-2)

我不明白为什么这对你不好。您的代码中几乎没有其他匹配项。您使用一个参数调用了一个函数,并且您获得了最佳匹配。

如果你有这个,那就不一样了:

bool test1(const XY &pos){
    return pos.x < pos.y;
}

bool test1(int x){
    return !x;
}

void functest(){
    int val = 5;
    test1(val);
}

如果要运行第一个,那就不好了,因为C ++不喜欢使用隐式构造函数。它倾向于“先键入,然后在构造函数中使用该类型的任何对象。”

但你所拥有的是一个论证与两个论点。我不知道为什么这是一个问题。