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();
Обратите внимание, что все работает (кроме fun3
, потому что я его никогда не определял).