如何使一个模板化的类成为另一个模板化类的朋友

问题描述 投票:0回答:1

出于教育目的,我正在基于单个链接列表编写模板化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;
}

感谢您的帮助。

c++ templates friend
1个回答
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.