我做了一些测试,遇到了这种奇怪的行为。
<div id='main-content'>
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
</div>
<button>Click me</button>
我确实清理了代码。运行时,我希望它显示“此处”。但是,它调用struct A{};
struct B : A{};
#include <iostream>
template<class T>
void fn2(T const &){
}
void fn2(A const &){
std::cout << "Here\n";
}
template<class T>
void fn1(){
T a;
fn2(a);
}
int main(){
fn1<B>();
}
的模板版本。
我也确实在戈尔德螺栓上进行了测试。我在那里重写了函数fn2()
和fn1()
,因此它们返回了fn2()
。那时,编译器做了正确的事情。
这是我的编译方式:
int
答案 0 :(得分:4)
选择模板版本是因为它完全匹配(T
推导为B
)。对于要调用的非模板版本,需要从B
到A
的隐式版本。那么模板版本将获得过载解析。
当将std::enable_if
推导为std::is_base_of
或其派生类时,可以将SFINAE与T
和A
一起使用,以从过载集中消除模板版本
template<class T>
std::enable_if_t<!std::is_base_of_v<A, T>> fn2(T const &){
}