Avi*_*pal 7 c++ undefined-reference
我正在尝试运算符重载,我的头文件包括:
#ifndef PHONENUMBER_H
#define PHONENUMBER_H
#include<iostream>
#include<string>
using namespace std;
class Phonenumber
{
friend ostream &operator << ( ostream&, const Phonenumber & );
friend istream &operator >> ( istream&, Phonenumber & );
private:
string areaCode;
string exchange;
string line;
};
#endif // PHONENUMBER_H
Run Code Online (Sandbox Code Playgroud)
和类的定义
//overload stream insertion and extraction operators
//for class Phonenumber
#include <iomanip>
#include "Phonenumber.h"
using namespace std;
//overloades stram insertion operator cannot be a member function
// if we would like to invoke it with
//cout<<somePhonenumber
ostream &operator << ( ostream &output, const Phonenumber &number)
{
output<<"("<<number.areaCode<<")"
<<number.exchange<<"-"<<number.line;
return output;
}//end function opertaor <<
istream &operator >> ( istream &input, Phonenumber &number)
{
input.ignore(); //skip (
input>>setw(3)>>number.areaCode;//input areacode
input.ignore(2);//skip ) and space
input>>setw(3)>>number.exchange;//input exchange
input.ignore();//skip -
input>>setw(4)>>number.line;//input line
return input;
}
Run Code Online (Sandbox Code Playgroud)
通过main完成调用
#include <iostream>
#include"Phonenumber.h"
using namespace std;
int main()
{
Phonenumber phone;
cout<<"Enter number in the form (123) 456-7890:"<<endl;
//cin>> phone invokes operator >> by implicitly issuing the non-member function call operator>>(cin,phone)
cin >> phone;
//cout<< phone invokes operator << by implicitly issuing the non-member function call operator>>(cout,phone)
cout << phone<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但编译它显示编译器错误:undefined reference to 'operator>>(std:istream&, Phonenumber&)'
有人可以帮助我解决此错误
Die*_*Epp 14
错误"未定义引用..."是链接器错误.您的代码很好,但是您没有将所有源文件链接到最终产品中Phonenumber.cpp(或者您称之为的任何内容)被忽略了.
在我的系统上,
$ ls Phonenumber.cpp Phonenumber.h main.cpp $ g++ main.cpp /tmp/cce0OaNt.o: In function `main': main.cpp:(.text+0x40): undefined reference to `operator>>(std::basic_istream<char, std::char_traits<char> >&, Phonenumber&)' main.cpp:(.text+0x51): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, Phonenumber const&)' collect2: ld returned 1 exit status
请注意如何Phonenumber.cpp不包含在编译中.如果包括它,
$ g++ main.cpp Phonenumber.cpp $ ./a.out Enter number in the form (123) 456-7890: (555) 555-1234 (555)555-1234
仅仅定义.cpp文件是不够的,您必须在链接时包含.这不适用于头文件.
图:
Source code ---compile--> Object files ---link--> Application
Phonenumber.cpp ----+
|---> Phonenumber.o ---+
+---+ |
| |
Phonenumber.h --+ +--> a.out
| |
+---+ |
|---> main.o ----------+
main.cpp -----------+