出于教育目的,我正在基于单个链接列表编写模板化Stack类。我已经为节点编写了一个类:
template <typename T>
class StackNode {
private:
T data;
StackNode<T> *next;
// TODO: make Stack a friend
};
并且我开始写堆栈本身:
template <typename T>
class Stack {
private:
StackNode<T> *head;
unsigned long long int size;
public:
Stack(): head(nullptr), size(0) {}
void push(const T& element) {
StackNode<T> *new_element = new StackNode<T>;
new_element -> data = element;
new_element -> next = head;
head = new_element;
++size;
}
};
显然,这两行
new_element -> data = element;
new_element -> next = head;
给我带来麻烦,因为我正在尝试访问私人成员。我想让Stack
成为StackNode
的朋友。我该怎么办?
[当我在friend class Stack<T>
的TODO行中写入StackNode
时,我的CLion IDE用红色的波浪线在Stack
下划线,它表示我已将Stack
重新定义为另一种符号。我不知道该如何解决。
UPD:我的main
函数如下所示:
int main() {
Stack<long long int> s;
s.push(12);
return 0;
}
感谢您的帮助。
您的问题仍然无法重现。如果您想解决此类问题,请尝试使用wandbox之类的在线编译器...
我们只能猜测您的问题是什么。这样可以正确完成:
#include <iostream>
template<class T>
class Foo;
template<class T>
class Bar
{
public:
Bar(T t) : v(t) {}
private:
T v;
friend class Foo<T>;
};
template<class T>
class Foo
{
public:
void Fun(Bar<T> bar)
{
std::cout << bar.v;
}
};
int main()
{
Bar<int> bar(99);
Foo<int> foo;
foo.Fun(bar);
}