2012-09-07 66 views
2

我在通過函數傳遞常量類時遇到了問題。將const的CName傳遞爲此參數會丟棄限定符

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

我收到此錯誤時,常量被放在函數頭的背面

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&)' 
+1

一個小而不相關的提示:不要像你這樣使用'auto'。在舊的C++ 03標準中,它確實沒有做任何事情,而在新的C++ 11標準中,它被用來推斷變量的類型。 –

+0

啊,謝謝,它是我老師灌輸給我們的一種老習慣。自動被用來在程序結束時自動創建和丟棄? –

+0

爲了使函數爲const,你必須提供關鍵字AFTER函數名和簽名:void void WriteFullName(ostream&outstream = cout)const {/ *你的代碼* /}' – Rost

回答

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選項告訴編譯器創建一個目標文件,以後可以用來鏈接程序。最後一個命令實際上不會編譯任何源,而是使用兩個目標文件來創建程序。

+0

我使用膩子與所有文件在同一目錄中。我使用main.cpp cname.h和cname.cpp來實現應該如何發佈完整的頭文件和實現? –

+0

@GenoDiaz這不應該是需要的,只是你用來編譯和鏈接所有文件的命令。 –

+0

不幸的是,當我一起構建它們時,我的實現文件會導致更多的錯誤。例如我的成員函數試圖訪問其他成員時的作用域定義錯誤。 –

相關問題