Изучая C++ по биту в кодовых блоках, я столкнулся с этой ошибкой. Я попробовал это в течение нескольких часов и увидел различные ссылки, но его до сих пор не работает,C++ неопределенная ссылка при перегрузке оператора извлечения
main.cpp
#include <iostream>
#include "Person.h"
using namespace std;
int main()
{
foo:: Person p;
//std:: cin >> p;
std:: cout << p;
return 0;
}
Person.h
#ifndef PERSON_H
#define PERSON_H
namespace foo{
class Person
{
public:
int age;
Person();
friend std:: ostream& operator << (std::ostream&,const Person&);
//friend std:: istream& operator << (std:: istream& in, Person& p);
protected:
private:
// std::string name;
};
}
#endif // PERSON_H
Person.cpp
#include <iostream>
#include "Person.h"
using namespace foo;
Person::Person()
{
age = 0;
//name = "noname";
}
std:: ostream& operator <<(std:: ostream& out, Person const &p)
{
out << "Extraction operator" << std:: endl << p.age << std:: endl;
// out << p.name << std::endl;
return out;
}
/*std:: istream& operator >>(std:: istream& in, Person &p)
{
in >> p.age >> p.name;
return in;
}*/
Q1. Почему нам нужно создать файл заголовка и Person.cpp в отдельном пространстве имен? Угадайте: это потому, что cout просто означает глобальное пространство имен, а затем мы снова имеем перегруженный cout, и какое определение компилятор будет называть его не уверенным?
Q2. Создав объект p класса Person в пространстве имен foo в главном и вызывающем std :: cout < < p, что мы пытаемся сделать? (Станд в станд пространстве имен, и мы хотим, чтобы вызвать перегруженный оператор)
Ошибка:
undefined reference to foo:: operator<<(std::ostream&, foo::Person const&)')
Если записать возраст в частном он говорит, что его частная, но будучи другом он должен иметь доступ к частных членов. Я знаю, что это связано с пространством имен, но я не могу узнать причину.
no match for operator >> in std::cin Раньше он давал вышеуказанные и многие другие ошибки, поэтому я попытался использовать два пространства имен, но все еще не работал.
Один вопрос на вопрос пожалуйста. – emlai