模板声明中省略了 c++ 类型参数。但是,在成员函数的定义中呢?

c++ type arguments are omitted in template declaration. However, how about in the definition of member function?

对不起,我是 c++ 编程的初学者。

据我所知,模板声明中的类型参数可以省略。例如

template<typename T>
class A{
A<T> func(A<T> t);
}

可以写成

template<typename T>
class A{
A func(A t) {}
}

此外,我知道如果成员函数定义在class之外,则不能省略类型参数。但是,我发现函数参数类型中的类型参数也可以省略。为什么会这样?

我的意思是

A<T> A<T>:: func(A<T> t) {}

为什么下面的代码是允许的,即使它在模板声明之外?

A<T> A<T>:: func(A t) {}

之所以有效,是因为 A<T>:: 限定了声明的范围——它后面的所有内容都知道 A<T> 的内容,包括注入的类名 A。这也严格按照源代码顺序,导致以下两个语义相同的定义之间的好奇心:

A A<T>::func(A t) {} // Doesn't work -- `A` is not known before `A<T>::`

auto A<T>::func(A t) -> A {} // Works, because the return type is after `A<T>::`!