我有这个简单的代码:
class A{};
class B : public A{};
class C : public B{};
class Test
{
public:
template<typename T>
void f(T&){printf("template\n");}
void f(A&){printf("specialization\n");}
};
int main()
{
A a;
B b;
C c;
Test test;
test.f(a);
test.f(b);
test.f(c);
}
Run Code Online (Sandbox Code Playgroud)
当我运行它(VS2010)时,我有这个输出:
specialization
template
template
Run Code Online (Sandbox Code Playgroud)
是否可以使用A-derived类进行调用以使用特化?
我有以下代码:
#include <iostream>
template <typename T>
void f (T) { std::cout << "f(T)" << std::endl; }
template <typename T>
void f (bool) { std::cout << "f(bool)" << std::endl; }
int main ( )
{
f(true); // #1 prints f(T)
f<bool>(true); // #2 prints f(bool)
}
Run Code Online (Sandbox Code Playgroud)
该#1行称f(T),虽然#2行调用f(bool).
为什么会这样?选择重载模板函数的规则是什么?
UPDATE
我明白在第一次调用时,编译器T在尝试调用第二个函数时无法推断,因此选择第一个函数.
在第二个调用中,第二个函数被认为是更好的匹配gcc,而第一个函数是在VS2013下选择的.谁在这里做对了?顺便说一下,我仍然对这个过程的完整描述感兴趣.