gpt4 book ai didi

具有默认参数的 C++ 模板

转载 作者:行者123 更新时间:2023-11-28 00:59:54 25 4
gpt4 key购买 nike

这是我第一次尝试使用其迭代器实现自定义 STL 兼容容器,但我在模板语法和用法方面遇到了一些麻烦。这是我的头文件的一部分:

namespace unstd {

template<typename T,class Allocator = std::allocator<T>>
class SList
{

public:

typedef typename Allocator::value_type value_type;
typedef typename size_t size_type;
typedef typename Allocator::template rebind<T>::other allocator_type;
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;
typedef typename T* pointer;
typedef typename const T* const_pointer;
typedef typename ptrdiff_t difference_type;

typedef typename SList_Iterator_Forward<T> iterator;
typedef typename const SList_Iterator_Forward<T> const_iterator;

....
/*----- ITERATORS -------*/
iterator begin();
...
};}

让我们以 begin() 方法为例。我编写了以下(在 .cpp 文件中)无法编译的内容:

template<typename T, class Allocator>
iterator SList<T,Allocator>::begin()
{

}
//neither the following compile
template<typename T, class Allocator>
SList<T,Allocator>::iterator SList<T,Allocator>::begin()
{

}

我有几个问题:

  1. 为什么不能编译? (错误 C2143 语法错误:在“token2”之前缺少“token1”)
  2. 为什么我必须明确指定所有模板参数,甚至是默认参数? (es.考虑到 Allocator 有默认值,为什么我不能只指定 T?)
  3. 在这种情况下将 header 与实现分开是否正确?

最佳答案

1)

template<typename T, class Allocator>
typename SList<T,Allocator>::iterator SList<T,Allocator>::begin()
^^^^^^^^

这很烦人,但习惯了。编译器假设所有像这样的模板化的东西都是变量,所以如果它是一个类型,你必须特别说明。

2) 编译器需要知道函数定义是针对具有两个模板参数的SList 类的,并且两者都可以是任何东西,这不是特化。我知道你的是默认的,如果缺少默认值也不会模棱两可,但我认为这主要是为了简化编译器。

3) 定义可以在一个单独的文件中,但不能在它自己的“翻译单元”(编译文件.cpp 及其包含)中。所以,不要把它放在 .cpp 中,那只会让人感到困惑。模板定义位于标题底部的 .incl 文件中并不少见。这让编译器很高兴,而且您仍然可以分离声明和定义。

关于具有默认参数的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9299087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com