【发布时间】:2018-04-05 17:53:49
【问题描述】:
我实际上是在 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
}
我想定义函数 inside class 定义会起作用,因为 Node 在那里有意义...这是正确的方法吗?即使是这样,我想必须有一种方法可以按照我尝试的方式定义函数......
【问题讨论】:
-
就像你必须做
List<T>::find告诉编译器find在哪里你需要对Node做同样的事情。 -
@Justin 谢谢,这行得通!我错过了
typename(我尝试了你和@NathanOliver 最初所说的,但我认为那也是错误的,因为没有typename,我得到了错误)。您能否将此添加为答案,以便我可以将其标记为解决方案?另外,你能解释一下为什么我需要typename吗? -
请注意,在模板中,我通常倾向于使用
const T&参数而不是T,因此如果T类似于std::string,则不会有不必要的副本。 (一个可能的例外是像prepend或append这样的“插入”类型操作,您可以在其中使用按值传递,然后将参数 move 到容器中,以避免必须编写单独的副本prepend(const T&)并移动prepend(T&&)版本的方法。)