【问题标题】:How to make a templated class a friend of another templated class如何使模板类成为另一个模板类的朋友
【发布时间】:2020-01-03 11:52:09
【问题描述】:

出于教育目的,我正在编写一个基于单链表的模板化 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 的朋友。我该怎么做?

当我在 StackNode 的 TODO 行中写入 friend class Stack&lt;T&gt; 时,我的 CLion IDE 用红色波浪线在 Stack 下划线,它表示我已将 Stack 重新定义为另一种符号。我不知道如何解决这个问题。

更新: 我的main 函数如下所示:

int main() {
    Stack<long long int> s;
    s.push(12);
    return 0;
}

感谢您的帮助。

【问题讨论】:

  • 为什么不在 Stack 的私有范围内将 StackNode 类定义为 struct 呢?那你就不会有这个问题了。 StackNode 中不需要私有成员,因为它对外不可见。
  • 此外,您应该展示一个最小的可复制示例,因为无论如何如果没有前向声明,这将无法工作。所以我们不能确定你做错了什么。
  • @lars 同样,出于教育目的,我不想将 StackNode 定义为结构。
  • @lars 我添加了我的主要功能。现在是完整的脚本。
  • 出于教育目的,选择简单、好的设计是有意义的。我认为这不是很好的“朋友”例子。

标签: c++ templates friend


【解决方案1】:

好吧,您的问题仍然无法重现/完整。 如果您想解决此类问题,请尝试使用 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);
}

【讨论】:

  • 令人惊讶的是,这很有帮助。我忘了在声明它为朋友之前声明这个类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多