传递std :: ostream功能?

时间:2013-01-27 22:02:02

标签: c++

我正在使用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

不幸的是,行为不符合预期(日期未显示),但我的原始问题已得到解答。我会继续戳它。感谢您对菜鸟的耐心!

0 个答案:

没有答案