之间有什么区别
template <class T>
class why
{
public:
why()
{}
};
和
template <class T>
class why
{
public:
why<T>()
{}
};
他们似乎都工作相同并且编译。
修改
而且,如果它们真的相同,为什么即使在C ++语言中这个功能呢?
答案 0 :(得分:3)
他们是等同的。在前者中,why
是注入的名称,其定义与why<T>
相同(其中T
是实际的模板参数。)这是为了方便打字。
请注意,此注入是在类的范围内,而不是在它之外。很明显,但是给出了:
template <typename T>
struct foo
{
foo x(foo f);
};
一个常见的错误可能是尝试定义x
,如下所示:
template <typename T>
foo foo<T>::x(foo f) { return f; }
但这将是一个错误,因为返回类型中的foo
需要模板参数。但是,参数列表中的foo
是可以的,因为在foo<T>::
之后我们在类的范围内,而foo
被定义为foo<T>
。因此,正确的方法是:
template <typename T>
foo<T> foo<T>::x(foo f) { return f; }
template <typename T>
foo<T> foo<T>::x(foo<T> f) { return f; } // equivalent