嵌套模板类返回类型在 C++ 中的头文件中函数返回类型的语法

Syntax for Function Return Type in a Header File for a Nested Template Class Return Type in C++

本文关键字:返回类型 文件 语法 函数 C++ 嵌套      更新时间:2023-10-16

我正在努力构建我自己的向量类,类似于你会发现C++ STL 的向量。在我的头文件中有两个类,我的向量类和我的迭代器类,这是一个嵌套的模板类。我想知道嵌套迭代器类的返回类型的正确语法是什么。在我的代码中,我正在寻找正确的方法来为我的 begin() 函数和 end() 函数编写正确的返回类型语法,这两个函数都在我的向量类中。begin()end() 都应该有返回类型的vector <T> :: iterator但这似乎不起作用。以下是我的代码当前设置方式。

template <class T>
iterator;
/************************************************
 * VECTOR
 * A class that holds stuff
 ***********************************************/
template <class T>
class vector
{
public:
   // code removed for brevity
   // Methods of the Vector class
   vector <T> :: iterator begin();
   vector <T> :: iterator end();

private:
   // Code removed for brevity
};
/**************************************************
* VECTOR ITERATOR
* An iterator through array
*************************************************/
template <class T>
class vector <T> :: iterator
{
    // ...code removed for brevity
};

此外,我是否有位于 .h 文件顶部的以下两行的正确代码?

template <class T>
iterator;

还是这个?

template <class T>
vector <T> :: iterator;

谢谢!

你可以简单地将iterator的定义移到vector

template <class T>
class vector {
public:
    class iterator {
        /* How you implement a iterator of type T */
    };
    iterator begin(); // for example
    // other fantastic stuff
};
template <class T>
vector<T>::iterator vector<T>::begin()
{
    // whatever
}

如果您不想在内部定义iterator,这可能会:

template <class T>
class vector {
public:
    class iterator; // only a declaration
    iterator begin(); // same
    // other fantastic stuff
};
template <class T>
class vector<T>::iterator {
    // the actual definition goes here
};
template <class T>
vector<T>::iterator vector<T>::begin()
{
    // same
}

或者,您也可以单独定义iterator并将vector::iterator设为别名:

template <class T>
class iterator { /* real definition */ };
template <class T>
class vector {
public:
    using iterator = ::iterator<T>;
    // or typedef ::iterator<T> iterator;
    iterator begin(); // still the same
    // same fantastic stuff
};
template <class T>
vector<T>::iterator vector<T>::begin()
{
    // all the same
}

希望这有帮助。