c ++模板不报告局部变量的错误

gma*_*dau 3 c++ templates

为什么报告错误:

class a {
public:
    void b() {this->c++;}
};

int main() {
    a var;
}
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

template <typename d> class a {
public:
    void b() {this->c++;}
}; 

int main() {
    a<int> var;
}
Run Code Online (Sandbox Code Playgroud)

尽管"a"是模板类,但函数"b"或至少对变量"c"的访问不依赖于类型"d",因此它应该报告某些内容.

但是,如果我调用"var.b();" 在主函数中它给出了一个错误.

我知道这是一个简单的问题我真的无法理解.

vso*_*tco 6

那是因为函数a<int>::b()没有实例化,因为它是一个模板.当您尝试实例化它,即调用它时var.b();,编译器将吐出错误.您必须了解模板是"按需"实例化的,即编译器需要实例化时.否则只会进行最少的语法验证.有关模板中实例化/名称查找的详细信息是一个相当复杂的主题,我强烈推荐这本书:C++模板: David Vandevoode和Nicolai Josuttis 的完整指南.

第一个代码片段的情况并非如此:该函数必须从一开始就有效.