传递const CName作为此参数会丢弃限定符

时间:2012-09-07 09:29:59

标签: c++ class const qualifiers

我在通过函数传递常量类时遇到了麻烦。

 // 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&)'

1 个答案:

答案 0 :(得分: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选项告诉编译器创建一个目标文件,以后可以用它来链接你的程序。最后一个命令实际上不会编译任何源,而是使用这两个目标文件来创建程序。

相关问题