c++ - 访问类中定义的友元函数

标签 c++ friend

有这样的代码:

#include <iostream>

class A{

public:
    friend void fun(A a){std::cout << "Im here" << std::endl;}
    friend void fun2(){ std::cout << "Im here2" << std::endl; }
    friend void fun3();
};

void fun3(){
    std::cout << "Im here3" << std::endl;
}

int main() 
{  
    fun(A()); // works ok
    //fun2(); error: 'fun2' was not declared in this scope
    //A::fun2(); error: 'fun2' is not a member of 'A'
    fun3(); // works ok
} 

如何访问函数 fun2()?

最佳答案

class A{

public:
    friend void fun(A a){std::cout << "Im here" << std::endl;}
    friend void fun2(){ std::cout << "Im here2" << std::endl; }
    friend void fun3();
};

尽管您对 fun2 的定义 确实 定义了一个“全局”函数而不是一个成员,并使它成为 friend A 同时,您仍然缺少在全局范围内对同一函数的声明。

这意味着该范围内的代码都不知道 fun2 存在。

同样的问题发生在 fun 上,除了 Argument-Dependent Lookup 可以接管并找到函数,因为有一个 A 类型的参数。

我建议改为以通常的方式定义您的函数:

class A {
   friend void fun(A a);
   friend void fun2();
   friend void fun3();
};

void fun(A a) { std::cout << "I'm here"  << std::endl; }
void fun2()   { std::cout << "I'm here2" << std::endl; }
void fun3();

现在注意 everything works (fun3 除外,因为我从未定义过它)。

关于c++ - 访问类中定义的友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57485916/

相关文章:

c++ - 使用静态库编译 C++

c++ - std::vector operator==: 值或引用比较?

c++ - 有效的 C++ 语句?

c++ - 私有(private)枚举访问无法从嵌套类的友元函数编译

c++ - 友元函数未声明的标识符

c++ - 从指向成员变量的指针获取类和成员类型

ruby-on-rails - 如何在 ruby​​ on rails 中创建邀请好友?

c++ - 友元函数和命名空间。无法访问类中的私有(private)成员

c++ - 友元函数默认模板 : Intel ICPC warning

c++ - 获取剩余帧数以在ALSA中播放