抱歉,我是 C++ 编程的初学者。
据我所知,模板声明中的类型参数是可以省略的。例如
template<typename T>
class A{
A<T> func(A<T> t);
}
可以写成
template<typename T>
class A{
A func(A t) {}
}
此外,我知道如果成员函数是在类外部定义的,则不能省略类型参数。但是,我发现函数参数类型中的类型参数也可以省略。为什么会这样?
我的意思是
A<T> A<T>:: func(A<T> t) {}
为什么下面的代码即使在模板声明之外也是允许的?
A<T> A<T>:: func(A t) {}
最佳答案
之所以有效是因为 A<T>::
声明的范围——它后面的所有内容都知道 A<T>
的内容,包括注入(inject)的类名 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>::`!
关于模板声明中省略了 C++ 类型参数。但是,在成员函数的定义中又如何呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46979092/