我实际上是在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
定义之外定义该函数?
由于Node
是List
类的私有成员,因此无效:
template <typename T>
Node * List<T>::find(T val)
{
// stuff
}
我认为定义里面的函数 class
定义会起作用,因为Node
在那里有意义......这是正确的方法吗?即便如此,我想必须有一种方法来定义函数,就像我想要的那样......
答案 0 :(得分:8)
由于
Node
是List
类的私有成员,因此无效:
实际上,这是不正确的。它没有失败,因为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 *