如何编写返回仅存在于类中的类型的成员函数?

时间:2018-04-05 17:53:49

标签: c++ list

我实际上是在C ++中实现一个双向链表。

这是一种MWE:

namespace mynamespace {

template <typename T>
class List {
public:
    List();

    void prepend(T);
    void append(T);
    void remove(T);

private:
    struct Node {
        T value_;
        Node * prev_;
        Node * next_;
    };

private:
    Node * find(T); // <-- THIS IS MY PROBLEM

private:
    Node * head_;
    Node * tail_;
};

}

我想创建该函数的原因是因为我认为如果我能用这样的函数遍历列表,直到我找到一个给定的元素(我需要对它执行相同的操作)会很方便。 remove()功能无论如何)

但是如何在class定义之外定义该函数?

由于NodeList类的私有成员,因此无效:

template <typename T>
Node * List<T>::find(T val)
{
    // stuff
}

我认为定义里面的函数 class定义会起作用,因为Node在那里有意义......这是正确的方法吗?即便如此,我想必须有一种方法来定义函数,就像我想要的那样......

1 个答案:

答案 0 :(得分:8)

  

由于NodeList类的私有成员,因此无效:

实际上,这是不正确的。它没有失败,因为Node是私有的,但因为Node嵌套在List内。 Node课程的名称不是Node,而是List<T>::Node。但是,从Node depends on T开始,您必须编写typename List<T>::Node,否则编译器会假定List<T>::Node是值而不是类型。有关详细信息,请参阅this question

简而言之,请更换:

template <typename T>
Node * List<T>::find(T val)

有了这个:

template <typename T>
typename List<T>::Node * List<T>::find(T val)

或者,正如StoryTeller所指出的,如果您在List<T>课程的上下文中,则可以使用Node。您可以使用尾随返回类型来获取此上下文:

template <typename T>
auto List<T>::find(T val) -> Node *