当声明模板参数时,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;
}
答案 0 :(得分:8)
如果模板参数默认为类型,语言当然可以工作;正如C在以前没有类型说明符时变量类型默认为int
时工作一样。需要克服一些含糊之处,例如:
typedef int T;
template <T> class C; // type, or non-type value of type `T`?
但是,强制您明确允许更好的诊断。如果我忘记指定非类型参数的类型,那么编译器可以立即发现错误并告诉我它。在你的世界中,它会假设我打算使用一个类型参数,并继续尝试相应地解释模板;可能会产生令人困惑的错误,或者甚至可能成功地编译完全错误的东西。
我不能评论这是不是在这里允许默认值(或者从C中删除默认变量类型,或者从不允许在C ++中使用它们)的原因,但这对我来说当然是一个很好的理由。
答案 1 :(得分:-1)
模板参数类型可能有很多不同的东西。 typename
是实践中最常见的,但您需要指定它。我想如果没有指定类型,那么语言可能会假设你的意思是typename
,但他们并没有这样说明。