C++中的模板类在编译时会“按需编译”,即其涉及到的成员仅在被用到时才被编译,其余部分仅做语法检查而省略了很多语义检查。本质是模板类的成员也是带模板的,因此需要实例化,而实例化仅在被使用时进行。倘若写了些在模板实例化时才会出错的代码,就会不容易发现错误甚至在编译时引起疑惑。以下举两例这样的代码:
调用不存在的函数
template<typename T>
struct zz{
zz(){}
zz(const zz &other){
other.func_non_exist(); // 函数不存在
}
};
int main()
{
zz<void>(z);
// zz<void> cz(z); // 直到调用拷贝构造函数还会检查到错误
return 0;
}
using基类成员
template<typename U>
struct Base{
using T = int;
};
template<typename U>
struct Derive : Base<U>{
using Base<U>::T; // 应该使用typename关键词来帮助判断Base<U>::T是一个类型
// T a; // 直到使用T才会报错
};
int main()
{
return 0;
}