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 因为我从来没有定义过)。

https://stackoverflow.com/questions/7785886/

相关文章:

c++ - 架构 x86_64 : Compiling problems 的 undefined s

c++ - 为什么 unique_ptr 实例化编译为比原始指针更大的二进制文件?

c++ - 为 Windows 编写超薄 C++ 程序(如 uTorrent)

c++ - 标准的 atomic bool 和 atomic flag 之间的区别

c++ - 在 C++ 中设置本地环境变量

c++ - QObject 多重继承

c++ - 为什么我们在 C++ 中使用 std::function 而不是原来的 C 函数指针?

c++ - 向 Python 公开 C++ API

c++ - C 和 C++ 标准之间的关系是什么?

c++ - 为什么这个包含 rand() 的 C++11 代码多线程比单线程慢?