模板成员函数语法

Template member function syntax

我目前正在用 C++ 实现容器,我对用于声明成员函数的语法有疑问。

我有一个 Vector_declaration.hpp 文件,我在其中声明向量 class 及其所有组件,例如:reference operator[](size_type n); 其中 referencetypedef typename Allocator::reference reference;

定义

在另一个名为 vector.hpp 的文件中,我想实现 Vector_declaration.hpp 中定义的元素,我发现唯一的方法是使用以下语法:

template <typename T, typename Allocator>
typename vector<T, Allocator>::reference
vector<T, Allocator>::operator[](size_type n)

我不明白typename vector<T, Allocator>::reference在这里起什么作用,为什么我每次在函数中使用它时都必须重写typename,难道我不能直接使用吗? reference 这个词呢? 有没有办法这样做,这样代码会更简洁?

这里:

template <typename T, typename Allocator> 
typename vector<T, Allocator>::reference 
vector<T, Allocator>::operator[](size_type n);

typename vector<T, Allocator>::reference是方法的return类型。考虑一下没有模板的情况:

struct foo {
   using reference = int&;
   reference bar();
};

foo::reference foo::bar() { /*...*/ }

reference声明在foo的范围内。如果您想在 foo 的范围之外引用它,您需要限定名称 foo::reference。因为这个:

reference foo::bar() { /*...*/ }

会导致错误:“未声明引用”。

此外,typename 是必需的,因为 vector<T, Allocator>::reference 是从属名称(即您需要告诉编译器它是一种类型,在特化中它可能是成员的名称或根本不存在)。

使用尾随 return 类型 (C++11),您可以:

template <typename T, typename Allocator>
auto vector<T, Allocator>::operator[](size_type n)
-> reference
{
// ...
}

vector<T, Allocator>:: 之前,您还不在范围 class 中,因此只写 reference 将指代全局范围 (::reference) 中的那个。

因此您可以在参数和尾随 return 类型(以及函数范围内)中使用 class 中的 types/using。