我无法理解为什么下列导致暧昧电话:重载决策与模板参数
#include <iostream>
// generic version f(X, Y)
template <class X, class Y>
void f(X x, Y y) {
std::cout << "generic" << std::endl;
}
// overload version
template <class X>
void f(X x, typename X::type y) {
std::cout << "overload" << std::endl;
}
struct MyClass {
using type = int;
};
int main() {
f(MyClass(), int()); // Call to f is ambiguous
}
我期望过载版本,这是更加专业化比普通版的第二个参数,以被选为最佳人选。我知道,如果我改变过载版本
template <class X>
void f(X x, int y) {
std::cout << "overload" << std::endl;
}
则呼叫解决就好了,这意味着它有一个事实,即X ::类型是依赖模板的名称,但仍然不能工作了做为什么失败。任何帮助深表感谢。
我打算写相同的答案,但卡住了导致你强调**但**在你的解释中的部分。我仍然无法消化你的答案中的第二个引号。然而,我相信这应该是被接受的答案。 – Leon
@Leon最初选错了报价,我的错。新的是我想要包括的那个。 – Barry