来自多个类的友元模板函数

Friending template function from multiple classes

本文关键字:友元 函数      更新时间:2023-10-16

我有这个代码:

template<typename T> T f() {
// ...
}
class A {
    friend A f();
};
class B {
    friend B f();
};

我收到ambiguating new declaration of ‘B f()’错误。

但是,如果我将代码更改为以下

template<typename T> void f(T arg) {
// ...
}
class A {
    friend void f(A);
};
class B {
    friend void f(B);
};

程序编译精细。

有人可以帮我找出问题所在吗?

friend A f();

此行声明非模板函数A f()存在,并且是类的友元。 这与f<A>()功能不同 - 它是一个全新的功能。

friend B f();

此行声明另一个具有相同名称但返回类型不同的非模板函数。 您不能重载函数的返回类型,因此禁止这样做。

这些 friend 声明都不引用您的模板函数,在您的

第二个示例中,两个 friend 声明仍然不引用先前声明的模板函数;它们引用其他一些非模板函数,就像您的第一个示例中的 friend 声明一样。

这可能是你的意思:

class A {
    friend A f<A>();
};
class B {
    friend B f<B>();
};

并且,要修复第二个示例:

class A {
    friend void f<A>(A);
};
class B {
    friend void f<B>(B);
};