模板成员函数语法
Template member function syntax
我目前正在用 C++ 实现容器,我对用于声明成员函数的语法有疑问。
我有一个 Vector_declaration.hpp 文件,我在其中声明向量 class 及其所有组件,例如:reference operator[](size_type n);
其中 reference
由 typedef 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。
我目前正在用 C++ 实现容器,我对用于声明成员函数的语法有疑问。
我有一个 Vector_declaration.hpp 文件,我在其中声明向量 class 及其所有组件,例如:reference operator[](size_type n);
其中 reference
由 typedef 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。