5

当声明模板参数是typename/class必要的(因为我在下面建议的语言不能使用 diff 语法)。我知道模板参数可以是整数,因此您必须选择默认为 int 或 to 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;
}
4

2 回答 2

8

如果模板参数默认为类型,该语言当然仍然可以工作;就像 Cint在没有类型说明符的情况下默认为变量类型时工作一样。需要克服一些歧义,例如:

typedef int T;
template <T> class C;  // type, or non-type value of type `T`?

但是,强迫您明确表示可以进行更好的诊断。如果我忘记指定非类型参数的类型,编译器可以立即发现错误并告诉我。在你的世界里,它会假设我想要一个类型参数,并继续尝试相应地解释模板;可能会产生令人困惑的错误,或者甚至可能成功编译完全错误的东西。

我无法评论这是否是此处不允许使用默认值的原因(或者从 C 中删除默认变量类型,或者从不允许在 C++ 中使用它们),但这对我来说肯定是一个足够好的理由。

于 2013-01-29T18:43:20.467 回答
-1

模板参数类型可能有很多不同的东西。typename在实践中是最常见的,但您需要指定它。我想如果没有指定类型,语言可能会假设你的意思typename,但他们没有那样指定。

于 2013-01-29T18:37:11.707 回答