如何让一个模板 class 成为另一个模板 class 的朋友
How to make a templated class a friend of another templated class
出于教育目的,我正在编写一个基于单链表的模板化堆栈 class。我为一个节点写了一个class:
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
的朋友。我该怎么做?
当我在 StackNode
的 TODO 行中写入 friend class Stack<T>
时,我的 CLion IDE 用红色波浪线在 Stack
下划线,它说我有重新定义Stack
作为一种不同的符号。我不知道如何解决这个问题。
更新:
我的 main
函数如下所示:
int main() {
Stack<long long int> s;
s.push(12);
return 0;
}
感谢任何帮助。
好吧,您的问题仍然无法重现/完成。
如果你想解决这样的问题,试试像wandbox这样的在线编译器。
一个例子就完成了,如果你能复制粘贴到在线编译器中导致错误,那你就想解决了。
我们只能猜测您的问题是什么。也许你错过了前向声明。这样,朋友声明就可以使用与示例中相同的 class 依赖结构完成:
#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);
}
出于教育目的,我正在编写一个基于单链表的模板化堆栈 class。我为一个节点写了一个class:
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
的朋友。我该怎么做?
当我在 StackNode
的 TODO 行中写入 friend class Stack<T>
时,我的 CLion IDE 用红色波浪线在 Stack
下划线,它说我有重新定义Stack
作为一种不同的符号。我不知道如何解决这个问题。
更新:
我的 main
函数如下所示:
int main() {
Stack<long long int> s;
s.push(12);
return 0;
}
感谢任何帮助。
好吧,您的问题仍然无法重现/完成。 如果你想解决这样的问题,试试像wandbox这样的在线编译器。 一个例子就完成了,如果你能复制粘贴到在线编译器中导致错误,那你就想解决了。
我们只能猜测您的问题是什么。也许你错过了前向声明。这样,朋友声明就可以使用与示例中相同的 class 依赖结构完成:
#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);
}