很抱歉,我是c ++编程的初学者。
据我所知,模板声明中的类型参数可以省略。例如
template<typename T>
class A{
A<T> func(A<T> t);
}
可以写成
template<typename T>
class A{
A func(A t) {}
}
另外,我知道如果成员函数是在类之外定义的,则不能省略类型参数。但是,我发现函数参数类型中的type参数也可以省略。为什么会这样?
我的意思是
A<T> A<T>:: func(A<T> t) {}
为什么下面的代码是允许的,即使它在模板声明之外?
A<T> A<T>:: func(A t) {}
答案 0 :(得分:2)
这可行的原因是因为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>::`!