当声明模板参数时 typename
/class
是必需的(因为在语言中不能使用 diff 语法,我在下面建议)。我知道模板参数可以是整数,所以你必须选择默认为 int 或 typename
/class 但仍然。
即为什么不
template <T>
T max(T a, T b) {
return a > b ? a : b;
}
代替
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
和
template<T, size_t n>
size_t array_size(const T (&)[n]) {
return n;
}
代替
template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
return n;
}
最佳答案
如果模板参数默认为类型,该语言当然仍然可以工作;就像 C 过去在没有类型说明符的情况下变量类型默认为 int
时一样。会有一些歧义需要克服,例如:
typedef int T;
template <T> class C; // type, or non-type value of type `T`?
但是,强制您明确说明可以更好地进行诊断。如果我忘记指定非类型参数的类型,那么编译器可以立即发现错误并告诉我。在你的世界里,它会假设我想要一个类型参数,并继续尝试相应地解释模板;可能会产生令人困惑的错误,或者甚至可能成功地编译了一些完全错误的东西。
我无法评论这是否是这里不允许默认值的原因(或者从 C 中删除默认变量类型,或者从不允许在 C++ 中使用它们),但这对我来说肯定是一个足够好的理由。
关于c++ - 声明模板时是否需要typename/class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589803/