Код, показанный ниже, не компилируется, когда функция друга mag() определена внутри класса, но работает, если определено вне класса (прокомментировано). Я думаю, что разница вызвана конструктором копирования, используемым для изменения типа аргумента от А до Б. Может ли кто-нибудь объяснить, почему я должен определять внешнюю функцию друга?функции функции друга и копирования
Кроме того, если класс B является классом шаблонов (добавление template <class T>
наверху), определение функции друга снаружи также не будет работать.
#include <iostream>
using namespace std;
class A {
};
class B {
public:
B(const A& p) {
std::cout << "Copy/Conversion constructor" << std::endl;
}
friend void mag(const B& p) {
std::cout << "Mag Inside`.\n";
}
};
//void mag(const B& p) {
// std::cout << "Mag Outside.\n";
//}
int main() {
A a;
mag(a);
return 0;
}
'B (const A &)' - конструктор преобразования, а не конструктор копирования. Вы также не указали, какую ошибку вы получите при компиляции. –
Ошибка: ошибка: использование необъявленного идентификатора «mag». – danny