У меня проблемы с передачей константного класса через функцию.
// 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&)'
Что у вас есть ошибки компоновщика, Это означает, что вы не связываетесь со всеми исходными файлами. Я предполагаю, что код для 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
Параметр указывает компилятору создать объектный файл, который впоследствии можно будет использовать для ссылки на вашу программу. Последняя команда на самом деле не будет компилировать какие-либо источники, но вместо этого использует два объектных файла для создания программы.
Других решений пока нет …