为什么C ++编译器选择错误的函数(模板)

时间:2019-02-23 13:52:55

标签: c++ templates gcc clang overload-resolution

我做了一些测试,遇到了这种奇怪的行为。

<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

1 个答案:

答案 0 :(得分:4)

选择模板版本是因为它完全匹配(T推导为B)。对于要调用的非模板版本,需要从BA的隐式版本。那么模板版本将获得过载解析。

当将std::enable_if推导为std::is_base_of或其派生类时,可以将SFINAETA一起使用,以从过载集中消除模板版本

template<class T>
std::enable_if_t<!std::is_base_of_v<A, T>> fn2(T const &){
}