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