重载解析,已定义函数和模板的顺序

时间:2019-03-12 10:49:48

标签: c++ templates overloading

请考虑以下代码段:

template<class T>
std::enable_if_t<std::is_integral<T>::value, bool> func(T value) {
    std::cout << "T\n";
    return func(static_cast<int64_t>(value));
}

bool func(int64_t value) {
    std::cout << "int64_t\n";
    return true;
}

int main() {
    func(1);
}

它导致无限递归。但是,交换这两个函数的定义顺序(如果bool func(int64_t value)在模板一之前定义)有助于避免此问题。

那是为什么?函数重载的顺序重要吗?

2 个答案:

答案 0 :(得分:2)

当编译器解析第一个函数(模板)时,它对func的第二个重载一无所知。解析是从源文件的顶部到底部完成的。

这就是使用符号之前需要声明符号的原因。这也意味着仅在顶部使用bool func(int64_t);声明即可解决您的问题。

答案 1 :(得分:1)

  

函数重载的顺序重要吗?

从某种意义上说,重载的顺序很重要,如果在声明潜在的重载之前调用重载集,则尚未声明的函数将不参与重载解析。

在函数调用之前声明的重载顺序无关紧要。

相关问题