c++ - 来自多个类的好友模板函数

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

程序可以很好地编译。

谁能帮我找出问题所在?

最佳答案

friend A f();

此行声明非模板 函数A f()存在并且是类(class)的 friend 。 这与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);
};

关于c++ - 来自多个类的好友模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931818/

相关文章:

c++ - FILE* 在不同函数 c++ 中的初始化

c++ - 从函数隐式转换为函数指针?

mysql - SQL函数返回select case的结果

c++ - 我应该在 C++ 中使用结构吗?

c++ - 错误 C2259 : 'class' : cannot instantiate abstract class

c# - 将复杂结构从 C++ 编码到 C#

c++ - 需要一些建议来选择合适的容器

java - 软件良好实践 - 设置和获取方法

c++ - 使用 -std=c++0x 标志编译时,Unix 宏变得未定义

c++ - *cast* 和 *conversion* 是什么意思?