来自多个 类 的好友模板功能

Friending template function from multiple classes

我有这个代码:

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() 存在并且是class 的友元。 这与 f<A>() 的功能不同 -- 它是一个全新的功能。

friend B f();

此行声明了另一个 非模板 函数,名称相同,但 return 类型不同。您不能重载 return 类型的函数,因此这是被禁止的。

这些友元声明均未引用您的模板函数,在您的第二个示例中,两个友元声明未引用先前声明的模板函数;它们引用了其他一些非模板函数,就像您第一个示例中的友元声明一样。

这可能是你的意思:

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);
};