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

时间:2017-10-27 15:57:01

标签: c++ templates generic-programming

很抱歉,我是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) {}

1 个答案:

答案 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>::`!