0

我今天一整天都被我的代码难住了。我有许多课程来处理曲目和专辑的集合。我的代码编译并成功读取了文件,但是一旦我尝试在我的专辑集合类中使用 istream& 运算符,它就会在运行时出错。

这是错误:

   error LNK2001: unresolved external symbol "class std::basic_istream<char,struct    std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class AlbumCollection &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAVAlbumCollection@@@Z)1>C:\Users\Shardy\Desktop\AlbumDatabase\Debug\AlbumDatabase.exe : fatal error LNK1120: 1 unresolved externals

我真的很感激一些帮助。它变得令人沮丧。我的书和谷歌都没有透露任何信息。谢谢你的时间。

4

2 回答 2

0

微不足道,在您的主中,您出现了无与伦比的大括号。你的 else 语句应该在 (ie } else {...})之前有一个右大括号

更重要的是,我将尝试解决您主要列出的特定问题(关于编译)。首先,我列出我的假设。看起来,您的实现和接口被适当地分开(即您的类在头文件中声明,而您的实现在源文件中),因为您使用了作用域(::)来实现函数。

此外,我假设您的实现与您operator<<的 AlbumCollections 实现在同一个文件中。这很好,但是,您的主文件不知道这一点。目前仅针对源文件进行编译。如果没有更多信息,我认为这是解决您问题的关键。您将需要转发声明此运算符,以便它在其他文件中工作。

在专辑集合的头文件中,在声明之后包含前向声明AlbumCollection,如下所示(我假设您没有using在标题中使用该指令。如果是,您可能不应该使用):

std::istream& operator>>(std::istream& is, AlbumCollection& albums);

您可能需要在标题#include <iostream>中才能正确编译。但是,在您包含的任何地方AlbumCollection.h(或任何相应的标题被调用),这个重载都是可用的。当您将程序链接在一起时,将使用您之前定义的定义。此外,要使其正常工作,您可能必须inline从定义中删除限定符。

请注意,如果这是问题所在,则错误输出可能看起来很可怕。如果您遇到此问题,很多编译器错误输出将消失,并且调试您可能遇到的任何现有代码编译问题将变得更加简单。

于 2012-12-09T19:37:38.757 回答
0

一些问题:

  1. main.c:如果文件打开成功,说明文件加载成功。如果文件已经加载,为什么还要首先打开文件?嗯,怎么可能?
  2. main.c:你永远不会调用从文件中读取的任何方法。
  3. main.c:您可以使用if (file)而不是if (file.is_open())
  4. main.c:您}if声明中缺少结束语。
  5. main.c:你没有使用argc或者argv你可以声明mainmain(void).
  6. 您需要发布类声明(头文件)以及方法定义。
  7. duration.cpp:当您的输入法遇到非数字或空格的内容时,例如“:”,您的输入法会作呕。
  8. duration.cpp:您的加法运算符没有正确执行时间算术,尤其是溢出。尝试将“00:59:35”与“00:02:30”相加。
  9. duration.cpp:您operator==将返回最后一个表达式的结果,因为您使用的是逗号、',' 运算符。您可能想要使用&&or 逻辑 AND 运算符。
  10. duration.cpp:3 规则:如果定义构造函数、复制构造函数或析构函数,则应声明所有 3 和赋值运算符。
  11. duration.cpp:数学规则:如果你定义operator+或者 operator-你也应该实现操作符+=以及-=。请参阅 Boost 数学库。
  12. duration.cpp:排序规则:如果你打算排序或比较,你应该实现运算符<, <=, ==, !=, >,>=。提示:将时间转换为秒,这应该会让您在比较时更轻松。请参阅 boost::less_than_comparable。
  13. track.cpp:您的输入法先读取曲目名称,然后读取时长。数据文件首先显示持续时间,然后显示曲目名称。您也没有代码来处理持续时间和列之间的字段分隔符。

    Yep, a debugger would be helpful as well as pencil and paper to go through this code.

于 2012-12-09T19:22:14.700 回答