2

関数を介して定数クラスを渡すのに問題があります。

 // test the constructors
    auto    CName       nameOne("Robert", "Bresson");
    const   CName       nameTwo = nameOne;
    auto    CName       nameThree;

    // display the contents of each newly-constructed object...

    // should see "Robert Bresson"
    cout << "nameOne = ";
    nameOne.WriteFullName();
    cout << endl;

    // should see "Robert Bresson" again
    cout << "nameTwo = ";
    nameTwo.WriteFullName();
    cout << endl;

コンパイラが nameTwo.WriteFullName() にヒットするとすぐに、修飾子を破棄するというエラーが発生します。クラスが定数であることは知っていますが、それを回避する方法がわかりません。

関数は、次のように記述されたヘッダー ファイルにあります。

void    const WriteFullName(ostream& outstream = cout)
{
    outstream << m_first << ' ' << m_last;
}

関数ヘッダーの後ろに const を配置すると、このエラーが発生します

main.cpp:(.text+0x51): undefined reference to `CName::CName()'
main.cpp:(.text+0x7c): undefined reference to `CName::WriteFullName(std::basic_ostream<char, std::char_traits<char> >&) const'
main.cpp:(.text+0xbb): undefined reference to `CName::WriteFullName(std::basic_ostream<char, std::char_traits<char> >&) const'
main.cpp:(.text+0xf7): undefined reference to `CName::WriteFullName(std::basic_ostream<char, std::char_traits<char> >&) const'
main.cpp:(.text+0x133): undefined reference to `operator>>(std::basic_istream<char, std::char_traits<char> >&, CName&)'
main.cpp:(.text+0x157): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CName const&)'
main.cpp:(.text+0x1f4): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CName const&)'
main.cpp:(.text+0x22b): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CName const&)'
main.cpp:(.text+0x25f): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CName const&)'
main.cpp:(.text+0x320): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CName const&)'
main.cpp:(.text+0x347): undefined reference to `operator>>(std::basic_istream<char, std::char_traits<char> >&, CName&)'
4

1 に答える 1

0

あなたが持っているのはリンカーエラーです。これは、すべてのソースファイルとリンクしていないことを意味します. クラスのコードはCName別のソース ファイルにあり、それをビルド/リンクするのを忘れていると思います。

編集:複数のファイルのコンパイルとリンク

複数のソース ファイルからプログラムを作成するには、次のようにコマンド ラインですべてのソース ファイルを渡す必要があります。

$ g++ main.cpp cname.cpp -o myprogram

上記のコマンドは両方のソース ファイルを使用し、-oオプションはコンパイラにプログラムの名前を指定します。

各ソース ファイルを個別にコンパイルしてから、それらをリンクすることもできます。

$ g++ main.cpp -c -o main.o
$ g++ cname.cpp -c -o cname.o
$ g++ main.o cname.o -o myprogram

この-cオプションは、後でプログラムをリンクするために使用できるオブジェクト ファイルを作成するようにコンパイラに指示します。最後のコマンドは、実際にはソースをコンパイルしませんが、代わりに 2 つのオブジェクト ファイルを使用してプログラムを作成します。

于 2012-09-07T09:42:32.620 に答える