C++模板类按需编译造成的疑惑二例

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;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:《C++模板类按需编译造成的疑惑二例》https://dappur.tech/blog/10/