如何编写一个返回仅存在于类中的类型的成员函数? 我实际上是在C++中实现了一个双链表。

如何编写一个返回仅存在于类中的类型的成员函数? 我实际上是在C++中实现了一个双链表。,c++,list,C++,List,以下是一些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_;

以下是一些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_;
};

}
我认为在
定义中定义函数是可行的,因为
节点
在那里是有意义的。。。这是正确的方法吗?即使是这样,我想一定有一种方法来定义函数,就像我尝试的那样

由于
节点
列表
类的私有成员,因此这不起作用:

template <typename T>
Node * List<T>::find(T val)
{
    // stuff
}
事实上,这是不对的。它失败不是因为
节点
是私有的,而是因为
节点
嵌套在
列表
中。
节点
类的名称不是
节点
,而是
列表::节点
。但是,由于
Node
,您必须编写
typename List::Node
,否则编译器会假定
List::Node
是一个值而不是一个类型。有关更多信息,请参阅

简言之,将其替换为:


就像您必须执行
List::find
来告诉编译器
find
在哪里一样,您需要对
节点执行相同的操作@Justin谢谢,这很有效!我错过了
typename
(我尝试了你和@NathanOliver最初所说的,但我认为那也是错误的,因为没有
typename
,我就出错了)。请您将此添加为答案,以便我将其标记为解决方案,好吗?另外,请您解释一下为什么我需要
typename
?请注意,在模板中,我通常倾向于使用
const T&
参数,而不是
T
,因此在
T
类似于
std::string
的情况下,不会有不必要的副本。(一个可能的例外是“插入”类型的操作,如
prepend
append
,您可以使用一个传递值,然后将参数移动到容器中,以避免必须编写单独的副本
prepend(const T&)
和移动
prepend(T&)
方法版本。)或
自动列表::查找(T)->节点*
。我发现自己的眼睛不那么痛。
template <typename T>
Node * List<T>::find(T val)
template <typename T>
typename List<T>::Node * List<T>::find(T val)
template <typename T>
auto List<T>::find(T val) -> Node *