声明模板时是否需要typename / class

时间:2013-01-29 18:33:53

标签: c++ template-meta-programming

当声明模板参数时,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;
}

2 个答案:

答案 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,但他们并没有这样说明。