为什么在此代码中交换模板参数会修复错误?

时间:2015-05-23 23:42:09

标签: c++ templates

以下代码给出了无匹配的函数错误

#include<iostream>
using namespace std;
using namespace std;
template<class T, class U>
void fn (T t) {
    cout<<t<<endl;
}

int main(int argc, const char * argv[]) {
    fn<int>(1);
    return 0;
}


C:\Users\tegra\Desktop\test.cpp||In function 'int main(int, const char**)':|
C:\Users\tegra\Desktop\test.cpp|9|error: no matching function for call to 'fn(int)'|
C:\Users\tegra\Desktop\test.cpp|9|note: candidate is:|
C:\Users\tegra\Desktop\test.cpp|4|note: template<class T, class U> void fn(T)|
C:\Users\tegra\Desktop\test.cpp|4|note:   template argument deduction/substitution failed:|
C:\Users\tegra\Desktop\test.cpp|9|note:   couldn't deduce template parameter 'U'|

但是,如果像这样交换模板参数,则错误消失

#include<iostream>
using namespace std;
using namespace std;
template<class U, class T>
void fn (T t) {
    cout<<t<<endl;
}

int main(int argc, const char * argv[]) {
    fn<int>(1);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

T可以从调用中的参数中推断出来。 U不是。

当您编写fn<int>时,您明确指定第一个参数为int。如果U是第一个参数,则没有问题,因为可以推导出T。但是,如果T是第一个,则编译器不知道U应该是什么。