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

标签 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) {}
}

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

我的意思是

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/

相关文章:

haskell - 使用 Data 和 Typeable 获取构造函数的参数类型

c++ - 同时写入和读取文件

javascript - 我可以通过引用不存在的内容来使 Ember 模板构建失败吗?

python - 如何访问 Django 模板中的 AUTH_PROFILE_MODULE?

c++ - 如何判断未知类型数组的索引是否为空?

ios - 如何为不同的类编写一个通用的泛型函数?

c - 在 C 语言中,通用容器还是安全容器?

c++ - 当我尝试编译 zeromq 源代码时出现错误 LNK2019

java - 我怎样才能在 Emacs 中为 C++/Java 设置折叠?

c++ - 我应该在一个函数被调用的次数非常多的情况下使用它吗?