0

我正在使用 LLVM clang++(FreeBSD 上的 3.1 版)作为我的编译器来完成Wiley 的自学 C++ (第 7 版)的示例程序。英寸。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 */

我需要做什么才能编译此代码?

编辑:克里斯,clang++ 错误dt.Display(std::cout);

/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

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

4

0 回答 0