我实际上是在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_;
};
}
Run Code Online (Sandbox Code Playgroud)
我想创建该函数的原因是因为我认为如果我能用这样的函数遍历列表,直到我找到一个给定的元素(我需要对remove()函数执行相同的操作),它会很方便.
但是如何在定义之外定义该函数class?
由于Node是List该类的私有成员,因此无效:
template <typename T>
Node * List<T>::find(T val)
{
// stuff
}
Run Code Online (Sandbox Code Playgroud)
我想定义函数里面的class定义会的工作,因为Node有道理那里...那是要正确的方法是什么?即便如此,我想必须有一种方法来定义函数我正在尝试的方式......
由于
Node是List该类的私有成员,因此无效:
实际上,这是不正确的.它没有失败,因为它Node是私有的,但因为Node嵌套在里面List.这个Node类的名字不是Node,它是List<T>::Node.但是,由于Node 依赖于T,您必须编写typename List<T>::Node,否则编译器会假定它List<T>::Node是值而不是类型.有关更多信息,请参阅此问题.
简而言之,取而代之:
Run Code Online (Sandbox Code Playgroud)template <typename T> Node * List<T>::find(T val)
有了这个:
template <typename T>
typename List<T>::Node * List<T>::find(T val)
Run Code Online (Sandbox Code Playgroud)
或者,正如StoryTeller所指出的,如果你在List<T>课程的上下文中,你可以使用Node.您可以使用尾随返回类型来获取此上下文:
template <typename T>
auto List<T>::find(T val) -> Node *
Run Code Online (Sandbox Code Playgroud)