首页 > 解决方案 > 模板类初始化与模板函数初始化

问题描述

我试图围绕模板专业化在类和函数之间的不同之处展开思考。

在模板类方面,这里有一段编译代码(c++17, gcc10.2):

template<typename T>
class Student {
public:
    T num;
};


auto main() -> int {
    Student<int> *t;
    t->num =5;

在模板函数方面,这里有一段编译代码(c++17,gcc 10.2):


template<typename T>
T fib(T num) {
    if (num == 1) return 1;
    else if (num == 0) return 0;
    else return fib(num-1) + fib(num-2);
}

auto main() -> int {
    std::cout << fib(5);
    return 0;
}

我的问题是:为什么我应该传入模板类型参数来实例化main中的模板类,而我不必为模板函数做同样的事情?(现在,忽略我使用了指向模板类的指针。即使类被实例化,这个问题仍然有效。)

重新表述这个问题,我试图理解为什么<int>在类的主体中需要它才能编译,而编译器会自动推断模板类型,就像<int>模板函数的情况一样。

我知道模板函数在编译时提供了隐式实例化(来自引用)。但是,是什么阻止了编译器对示例代码中的类进行隐式实例化。我相信所有必要的信息在编译时都可用(如果我在这里错了,请纠正我)。

我一直提到的来源:

https://en.cppreference.com/w/cpp/language/class_template

https://docs.microsoft.com/en-us/cpp/cpp/explicit-instantiation?view=vs-2019

标签: c++

解决方案


推荐阅读