C++代码中模板特化函数test(A&)未被调用的原因是什么?
问题解答
1. 特化版本test(A& a)未被调用的原因
你调用test(a)时传入的参数a类型是A*(指向A的指针),而非A类型的左值:
- 模板参数推导阶段,编译器会根据传入的
A*类型左值,将通用模板的T推导为A*,最终实例化出的函数签名为void test(A*& t)。 - 你定义的显式特化版本签名是
void test(A& a),和实例化出的模板函数签名完全不匹配,因此编译器会选择更匹配的通用模板,输出A1。
如果要触发特化版本调用,修改调用逻辑为传入A类型左值即可,例如:
test(*a); // 解引用指针得到A类型左值,此时会匹配特化版本输出A2
2. 特化定义放在主模板前触发编译错误的原因
C++标准明确要求:显式特化必须在对应主模板的声明之后出现。
如果把template<> void test(A& a)放在通用模板template<typename T> void test(T &t)的声明之前,编译器处理到特化代码时,还没有感知到test是一个模板函数,自然无法识别你要对一个不存在的模板做特化,因此抛出'test' is not a template function的编译错误。
内容的提问来源于stack exchange,提问作者Hani Daher- Reinstate Monica
相关产品推荐
相关产品推荐

