在C++中声明模板时:class 和 typename 有什么区别,哪个更好用?
大家好!我开始学习C++中的模板,注意到有些例子使用关键字 `class`,而另一些使用 `typename`。例如,这两个声明在我看来做的是同一件事:
```cpp
template
void foo(T value) { }
template
void foo(T value) { }
```
我有点困惑。似乎两个版本都能工作,但哪个是正确的?除了语法之外,它们之间有什么区别吗?我读到过 `typename` 出现得较晚,一些老程序员习惯用 `class`。但我觉得用 `class` 来声明一个可能不是类(比如 `int` 或 `double`)的参数有点奇怪。而 `typename` 听起来更通用。
此外,我听说有些情况下只能使用 `typename`,而 `class` 不行。这是真的吗?如果是,请举例说明。总的来说,在现代C++(C++11、C++14、C++17、C++20)中,什么被认为是好的风格?推荐使用哪个?