4
4

1 回答 1

13
friend A f();

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

friend B f();

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

这些友元声明都没有引用您的模板函数,在您的第二个示例中,两个友元声明仍然没有引用先前声明的模板函数;它们指的是其他一些非模板函数,就像第一个示例中的朋友声明一样。

这可能是你的意思:

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);
};
于 2015-01-13T21:32:37.000 回答