我正在努力弄清类和函数之间模板专业化的区别。
关于模板类,这是一段编译的代码(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 中的模板类,而不必对模板函数做同样的事情? (目前,请忽略我已经使用了指向模板类的指针。即使实例化了该类,问题仍然有效。)
为了重新说明这个问题,我试图理解为什么在类的 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