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

メインを介して行われる呼び出しは

#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

「undefined reference to...」というエラーはリンカ エラーです。あなたのコードは問題ありませんが、すべてのソース ファイルを最終製品にリンクしていないPhonenumber.cpp(またはあなたがそれを何と呼んでいるのか) が除外されています。

私のシステムでは、

$ ls
電話番号.cpp 電話番号.h main.cpp
$ g++ main.cpp
/tmp/cce0OaNt.o: 関数「main」内:
main.cpp:(.text+0x40): `operator>>(std::basic_istream<char, std::char_traits<char> >&, Phonenumber&) への未定義の参照'
main.cpp:(.text+0x51): `operator<<(std::basic_ostream<char, std::char_traits<char> >&, Phonenumber const&)' への未定義の参照
collect2: ld が 1 つの終了ステータスを返しました

Phonenumber.cpphowがコンパイルに含まれていないことに注意してください。それを含めると、

$ g++ main.cpp 電話番号.cpp 
$ ./a.out
(123) 456-7890 の形式で番号を入力してください:
(555) 555-1234
(555)555-1234

ファイルを定義するだけ.cppでは十分ではなく、リンクするときに含める必要があります。これはヘッダー ファイルには適用されません。

図:

ソース コード ---コンパイル --> オブジェクト ファイル ---リンク --> アプリケーション

電話番号.cpp ----+
                    |---> Phonenumber.o ---+
                +---+ |
                | | | |
Phonenumber.h --+ +--> a.out
                | | | |
                +---+ |
                    |---> main.o ----------+
main.cpp -----------+
于 2012-06-22T07:46:11.290 に答える