2015-10-17 3 views
1

Изучая 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 Раньше он давал вышеуказанные и многие другие ошибки, поэтому я попытался использовать два пространства имен, но все еще не работал.

+1

Один вопрос на вопрос пожалуйста. – emlai

ответ

0

Я думаю, что вы используете неправильное заявление оператора

//friend std:: istream& operator << (std:: istream& in, Person& p); 

вместо

friend std:: istream& operator >> (std:: istream& in, Person& p); 

, а также определять методы класса в пространстве имен где было объявлено

#include <iostream> 
#include "Person.h" 

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; 
    } 

} 

ниже код работает отлично на MS Visual C++

#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <string> 

namespace foo{ 
    class Person 
    { 
     public: 
     Person(); 
     friend std:: ostream& operator << (std::ostream&,const Person&); 
     friend std:: istream& operator >> (std:: istream& in, Person& p); 
     protected: 
     private: 
     int age; 
     std::string name; 
    }; 
} 

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; 
    } 

} 

int main() 
{ 
    foo:: Person p; 
    std:: cin >> p; 
    std:: cout << p; 
    _getch(); 
    return 0; 
} 
+0

Спасибо за ответ, он решен, когда он объявлен публичным. Ошибки при определении возраста и имени: int foo :: Person :: age is private; std foo :: Person :: age is private; в >> p.age и >> ошибка p.name в этих двух строках. – Rooney10

+0

друг ключевое слово должно иметь дело с частным членом обращающегося – Mykola

+0

он должен иметь дело с этим ... но дает выше ошибки, это что-то связано с нарушением пространства имен доступа? – Rooney10

3

Вы определили operator<< в глобальном пространстве имен, но объявили его в пространстве имен foo.

Определить его в пространстве имен foo:

namespace foo 
{ 
    // definition 
} 
+0

ОП задал еще два вопроса. – LogicStuff

+1

Это два слишком много. – emlai

+0

@zenith thnx это сработало, когда возраст является общедоступным, но если он является частным, он дает ошибку int foo :: Person :: age является приватным, функция друга также должна иметь доступ к закрытым членам? – Rooney10

Смежные вопросы