我正在使用LLVM clang ++(FreeBSD上的3.1版)作为我的编译器,使用 Wiley的自学C ++ (第7版)的示例程序。在Ch。 23,“类继承”,提供以下代码:
Date.h - 基类:
...snip..
inline void Date::Display(std::ostream& os)
{ os << "Date: " << *this; }
...snip...
SpecialDate.h - 从Date派生的类并重载Display()函数:
#include "Date.h"
...snip...
void Display(std::ostream& os)
{ os << "SpecialDate: " << *this; }
...snip...
23-1.cpp - 实例化SpecialDate的对象并使用它:
#include <iostream>
#include "SpecialDate.h"
int main()
{
...snip...
// da, mo, & yr are all ints and declared
SpecialDate dt(da, mo, yr);
...snip...
dt.Display();
...snip...
编译代码时,我得到的唯一错误是:
./23-1.cpp:14:14: error: too few arguments to function call, expected 1, have 0
dt.Display();
~~~~~~~~~~ ^
./SpecialDate.h:15:2: note: 'Display' declared here
void Display(std::ostream& os)
^
1 error generated.
我可以看到我需要通过引用将一个std :: ostream类型变量传递给Display(),但我很难理解如何继续。 FWIW:Date.h和SpecialDate.h都使<<
运算符超载。我试过了:
dt.Display(std::cout); /* all sorts of weird compiler errors */
...
std::ostream os; /* error: calling a protected constructor of class */
dt.Display(os);
...
std::cout << dt.Display(); /* same "too few arguments" error */
我需要做些什么来编译这段代码?
编辑:
克里斯,dt.Display(std::cout);
的clang ++错误:
/tmp/23-1-IecGtZ.o: In function `SpecialDate::Display(std::ostream&)':
./23-1.cpp:(.text._ZN11SpecialDate7DisplayERSo[_ZN11SpecialDate7DisplayERSo]+0x34): undefined reference to `operator<<(std::ostream&, SpecialDate&)'
/tmp/23-1-IecGtZ.o: In function `Date::Date(int, int, int)':
./23-1.cpp:(.text._ZN4DateC2Eiii[_ZN4DateC2Eiii]+0x34): undefined reference to `Date::SetDate(int, int, int)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
此外,#include <iostream>
同时位于Date.h和SpecialDate.h中。
编辑2:重新读取dt.Display(std::cout);
的错误后,我意识到编译器没有看到SpecialDate和Date的来源,只是标题。所以我将它们添加到命令行,最后编译没有错误!
clang++ 23-1.cpp Date.cpp SpecialDate.cpp
不幸的是,行为不符合预期(日期未显示),但我的原始问题已得到解答。我会继续戳它。感谢您对菜鸟的耐心!