我正在使用 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
不幸的是,行为不符合预期(未显示日期),但我最初的问题已得到解答。我会继续戳它。感谢您对菜鸟的耐心等待!