【发布时间】:2018-01-01 01:00:20
【问题描述】:
看看这个(简化的)例子:
int foo(int) { return 0;}
double foo(double) { return 0.0; }
template <class T>
enable_if<is_integral<T>::value>
bar(T(*f)(T)) {}
int main()
{
bar(foo);
return 0;
}
我的期望是编译器将首先尝试为每个重载实例化模板,这将在第二次重载时失败 (SFINAE),因此候选集中只剩下 void bar(int(*f)(int),这将解决使用foo 的第一个重载。事实并非如此。它失败了,如下所示:
no matching function for call to ‘bar(<unresolved overloaded function type>)’
couldn't deduce template parameter ‘T’
有没有办法实现这样的目标?
【问题讨论】:
-
编译器如何推断模板参数 T?当给出 'T foo(T)' 时,你怎么知道引用了哪个 'foo'?
-
@OnMyLittleDuck 随着 OP 认为它的工作方式,它会工作:编译器将尝试推断
T用于int foo(int)重载,并将尝试它用于double foo(double)重载。然后,T = double将导致替换错误,因此只保留T = int。现在,虽然 C++ 不能那样工作,但 OP 的猜测确实有道理。 -
stackoverflow.com/q/27523684/3002139 非常接近。至少高度相关,可能是骗人的。
-
stackoverflow.com/q/30623939/3002139 也非常接近。 OP,如果其中任何一个符合您的需求,我将很乐意锤击。
-
我将不得不更仔细地观察它们。