特化详解"/>
C++模板特化详解
一、为什么需要模板特化
这周四,帮一个长相英俊的同事排查问题,他写了一段类似于这样的逻辑:
class student{int age = 25;
public:void mycout(){cout<<age<<endl;}
};template<typename T>
class Base
{T t;
public:Base(T t):t(t){}void display(){if(1==0){cout<<t<<endl;} }
};int main() {student stu;Base<student> base(stu);base.display();
}
看起来能编译通过,因为cout<<t<<endl,也就是cout<<stu<<endl这个不合理的逻辑永远不会被执行。但是,这个是编译不过的。
因为实例化后,编译器会二次编译实例化后的代码,cout<<stu这种行为,在二次编译的过程中会被检查出来有语法错误。
有个有意思的事情,去掉base.display();后,编译不会报错。根据《C++ primer》中的解释,对于类模板中的成员函数,即使在类模板实例化以后,如果这个函数不被调用,那么也不会被具体化。
言归正传,这个问题的解决方案就是模板特化!!!
更多推荐
C++模板特化详解
发布评论