用模板参数的模板来解决不明确调用的c++默认行为是什么

What is c++ default behavior to resolve ambiguous calls with template of template parameter?

本文关键字:默认 是什么 c++ 解决 参数 不明确 调用      更新时间:2023-10-16

考虑以下代码:

#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void f(T& a) {
    cout << "a" << endl;
}
template <typename T>
void f(vector<T>& a) {
    cout << "b" << endl;
}
int main(int argc, char** argv) {
    vector<vector<int>> v;
    f<vector<vector<int>>>(v);
    f<vector<int>>(v);
    f(v);
}

在对f的前两次调用中,我明确指定了要使用的模板版本,因此我可以控制要调用的函数版本。

第三个隐式调用应该是不明确的,因为正如前两个调用所显示的那样,我们可以选择。令人惊讶的是,g++编译器并没有侮辱我,而且毫无怨言地完成了它的工作。

输出为

a
b
b

这意味着CCD_ 1已经用于第三次呼叫。

那么,这种情况下的默认行为是什么呢?我的理论是,它采取了最严格的例子,这在这种情况下是有意义的。这是真的吗?这是在某个地方指定的吗,因为我不能相信随机性。

这里向量类没有什么特别之处。我实际上实现了一些图算法,但由于我可能对图有不同的表示,例如作为邻接列表向量<向量<支出<weighttype>gt>或者作为弧列表向量<arc<weighttype>gt,以及弧的不同表示,这取决于它是否是未加权/加权图/流网络,它可以携带不同类型的信息。我正在尝试使用模板编写通用代码,但目前我正面临这种问题。

感谢

据说您的第二个f比您的第一个f更专业,因此当两者匹配时,第二个f赢得过载解决方案。

标准中详细地给出了更专业化的确切定义,但其基本思想是弄清楚对其中一个的任何调用是否总能与另一个相匹配(但反之亦然(。也就是说,如果第二个f有一个std::vector<X>&,那么它也可以与第一个fT&相匹配。但是,如果第一个f<vector<int>>0有一个通用的X&,就不能保证它会与第二个fstd::vector<T>&相匹配。