来自多个班级的朋友模板功能

时间:2015-01-13 21:27:08

标签: c++ function oop friend friend-function

我有这段代码:

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

程序编译得很好。

有人可以帮我弄清问题是什么?

1 个答案:

答案 0 :(得分: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);
};