c++ - 模板友元函数的前向声明

标签 c++ templates friend

考虑以下运行良好的代码片段:

class A
{
private:
    int d;
public:
    A(int n){ d = n;}
    friend int foo(A a);
};

int foo(A a)
{
    return a.d;
}

但是,当我尝试为该类使用模板时,我需要转发声明友元函数才能运行,如下所示:

template <typename T>
class B;

template <typename T>
T foof(B<T> a);


template <typename T>
class B
{
private:
    T d;
public:
    B(T n){ d = n;}
    friend T foof<>(B<T> a);
};

template <typename T>
T foof(B<T> a)
{
    return a.d;
}

为什么前向声明在第二个例子中是必要的,而在第一个例子中却不需要?另外,为什么我必须放 <>在 B 类中的 foof 声明中?为什么在模板内部声明它还不够?我正在努力理解这些东西是如何工作的,以便在我需要使用它时不必盲目地记住这种代码。

谢谢

最佳答案

那是因为

friend int foo(A a);

同时是函数声明和友元声明,但是:

friend T foof<>(B<T> a);

是模板实例化的友元声明。那不一样。实例化不声明模板函数。


你可以和整个函数模板成为 friend ,然后就不需要前向声明了:

template <typename T>
class B
{
private:
    T d;
public:
    B(T n){ d = n;}
    template<class U>
    friend U foof(B<U> a);
};

关于c++ - 模板友元函数的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39678663/

相关文章:

vb.net - 为 VB.NET 项目设置项目默认值,以便控件的默认修饰符属性为 Private

c++ - 为什么 C++ 不允许继承友元?

c++ - 好友功能可访问性问题

c++ - 项目属性在外部结帐时丢失

c++ - luabind:如何通过引用将值从 C++ 传递到 lua 函数?

C++ 带定时器的多线程编程

c++ - 是否可以在编译时检测函数的默认参数?

javascript - 需要在点击输入元素之前显示daterangepicker(日历),当Html页面加载时

c++ - std::forward 不能转换大括号括起来的初始值设定项列表

C++ 获取自 01/01/0001 00 :00:00 以来的毫秒数