我正在尝试构建一个名为SetList
的STL容器,如下所示
template
<typename T>
class SetList
{
public:
struct ListNode
{
T info;
ListNode * next;
ListNode(T newInfo, ListNode * newNext)
: info(newInfo), next(newNext)
{
}
static ListNode * insert(const char *s)
{
*head->info = "test"; //error occurs here, whenever i try to assign head: "invalid use of member ‘SetList<T>::head’ in static member function"
}
};
struct iterator
{
typedef std::forward_iterator_tag iterator_category;
typedef iterator self_type;
typedef T value_type;
typedef T& reference;
typedef ListNode * pointer;
typedef ptrdiff_t difference_type;
private:
pointer buf;
public:
iterator(pointer ptr)
:buf(ptr)
{
}
};
SetList() : head(new ListNode("", NULL)) {}
iterator first(){return iterator(head);}
iterator last(){return iterator(NULL);}
~SetList(){}
private:
ListNode * head;
};
据我了解,问题与我使用静态这一事实有关,因此this
不存在于函数范围内,而是来自我的理解是,我已经在私人领域使用ListNode *head
来解决这个问题 - 或者这是不正确的?
我试图为链接列表构建一个简单的插入函数,但无法正确访问头部。
答案 0 :(得分:3)
由于head
不是static
,因此每个ListNode
都有自己的head
。因此,您需要this
指针才能访问head
您可以head
static
,但这实际上意味着所有列表具有相同的头部,并且您实际上只能有一个列表。
更好的解决方案是让insert
不是static
,这样您就可以访问head
并具有逻辑意义,因为您需要说明要插入的列表。< / p>
答案 1 :(得分:0)
您的插入功能不应该是static
,也不应该是您节点的一部分。它应该是您的SetList的成员。如果您希望它也是您节点的一部分,那么您应该在节点中创建一个方法,该方法也接受SetList&
参数,然后调用列表中的插入。
此外,您现在假设T始终可以从字符串中分配,这可能违背使用模板的要点。
答案 2 :(得分:0)
static
函数或字段由该类/结构的所有实例共享。由于您不需要该类的对象来使用static
函数,因此这具有static
函数无法访问实例字段的逻辑结果。
在您的示例中,ListNode * head
是一个属于某个对象的实例字段,每个对象都有自己的head
,因此无法知道哪个head
您是在static
方法中使用时引用的,因为它们与对象无关(您无法访问这些方法中的this
指针)。
对于类中有权访问this
指针的方法(为了能够访问实例字段),不需要将它们声明为static
。