繁体   English   中英

提取运算符重载中的c ++ undefined引用

[英]c++ undefined reference in extraction operator overloading

在codeblocks中逐位学习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。 通过在main中的foo命名空间中创建Person类的对象p并调用std :: cout << p,我们要做什么? (std在std命名空间中,我们想调用重载的运算符)

错误:

undefined reference to foo:: operator<<(std::ostream&, foo::Person const&)') 

如果我们私下写下这个年龄,它会说它是私人的,但作为朋友,它应该可以访问私人成员。 我知道它与命名空间有关,但我找不到原因。

在std :: cin中没有匹配运算符>>之前它给出了上述和许多其他错误,所以我尝试使用两个名称空间,但仍然无法正常工作。

您在全局命名空间中定义了operator<< ,但在命名空间foo声明了它。

在命名空间foo定义它:

namespace foo
{
    // definition
}

我认为你使用错误的运营商声明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM