模板函数,可否以回来值类型作为重载决议的判定规则
模板函数,可否以返回值类型作为重载决议的判定规则?
我记得曾经看到过一个说法是,重载函数的判定是用参数列表的类型,但是模板可以用返回值类型,于是我写了一点很短的代码:
发现编译不过。VC报错ambiguous call to overloaded function。
这是为什么呢? 网上这个说法不正确么?
------解决思路----------------------
这根本就不是重载,而是SFINAE。这个机制和重载的区别就在于:没有被选中的函数中,参数中存在至少一个 或 返回值 的类型无效(如果应用模板参数到这个函数的话),而重载中未被选中的函数虽然未被选中但参数和返回值类型都是有效的。比如那个例子里,不管选中的是哪个函数,另一个函数的返回值是无效的(此时它的返回值的enable_if里面没有包含type成员类型)。总之你只需要知道重载决议不会把返回类型当决议判定规则就对了
我记得曾经看到过一个说法是,重载函数的判定是用参数列表的类型,但是模板可以用返回值类型,于是我写了一点很短的代码:
class test
{
template<class T>
static int g(T i)
{
return i + 1;
}
template<class T>
static double g(T i)
{
return i + 100;
}
};
int main()
{
double d = test::g(1);
int i = test::g(1);
return 0;
}
发现编译不过。VC报错ambiguous call to overloaded function。
这是为什么呢? 网上这个说法不正确么?
------解决思路----------------------
这根本就不是重载,而是SFINAE。这个机制和重载的区别就在于:没有被选中的函数中,参数中存在至少一个 或 返回值 的类型无效(如果应用模板参数到这个函数的话),而重载中未被选中的函数虽然未被选中但参数和返回值类型都是有效的。比如那个例子里,不管选中的是哪个函数,另一个函数的返回值是无效的(此时它的返回值的enable_if里面没有包含type成员类型)。总之你只需要知道重载决议不会把返回类型当决议判定规则就对了