8

我正在尝试处理运算符重载,我的头文件包括:

#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

和类定义

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

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

但是编译它显示了一个编译器错误:undefined reference to 'operator>>(std:istream&, Phonenumber&)' 有人可以帮我解决这个错误吗

4

1 回答 1

16

错误“未定义对...的引用”是链接器错误。您的代码很好,但是您没有将所有源文件链接到最终产品中,Phonenumber.cpp(或任何您称之为的)都被排除在外。

在我的系统上,

$ ls
电话号码.cpp 电话号码.h main.cpp
$ g++ main.cpp
/tmp/cce0OaNt.o:在函数“主”中:
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 返回 1 个退出状态

请注意如何Phonenumber.cpp不包含在编译中。如果你包括它,

$ g++ main.cpp 电话号码.cpp 
$ ./a.out
在 (123) 456-7890 表格中输入号码:
(555) 555-1234
(555)555-1234

仅仅定义一个.cpp文件是不够的,你必须在链接时包含。这不适用于头文件。

图表:

源代码---编译--->目标文件---链接--->应用

电话号码.cpp -+
                    |---> 电话号码.o ---+
                +---+ |
                | |
Phonenumber.h --+ +--> a.out
                | |
                +---+ |
                    |---> main.o ----------+
main.cpp -----------+
于 2012-06-22T07:46:11.290 回答