有这样的代码:
#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/