如何让一个模板 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);
}