最好用一个简单的程序来说明这个问题。

#include <iostream>
#include <utility>

void printPoint(std::pair <int, int> point) {
    printPoint(point.first, point.second);
}

void printPoint(int x, int y) {
    std::cout << x << ' ' << y << std::endl;
}

int main(void) {
    std::pair <int, int> point(2, 3);
    printPoint(point);
    return 0;
}

我想让两个printPoint函数通过利用重载来完成同一件事。但是,虽然在printPoint函数的特定重载(在本例中为单参数)的范围内,但编译器仅允许我使用该特定重载,因此代码无法编译。

为什么是这样?此外,是否有任何方法可以缓解此问题,从而不必重复两次重写同一函数体?

最佳答案

声明顺序在这里很重要。

将第二个重载(printPoint(int, int))移到第一个重载(printPoint(std::pair <int, int>)之前;否则,它在第一个重载内是不可见的。即

void printPoint(int x, int y) {
    std::cout << x << ' ' << y << std::endl;
}

void printPoint(std::pair <int, int> point) {
    printPoint(point.first, point.second);
}

LIVE

07-27 13:36