C ++ Collection Objects& iStream文件输入

时间:2012-12-09 18:50:24

标签: c++ collections

我今天整天都对我的代码感到难过。我有很多课程来处理一系列曲目和专辑。 我的代码编译并成功读入文件,但是一旦我尝试使用istream&我的Album Collection类中的运算符在运行时出错。

这是错误:

   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

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

2 个答案:

答案 0 :(得分:0)

一些问题:

  1. main.c:如果文件成功打开,则说明该文件 已成功加载。为什么要打开第一个文件 如果它已经加载了?嗯,怎么会这样?
  2. main.c:你永远不会调用任何从文件中读取的方法。
  3. main.c:您可以使用if (file)代替if (file.is_open())
  4. main.c:您在}声明中错过了结束if
  5. main.c:您没有使用argcargv,因此您可以声明mainmain(void)
  6. 您需要发布类声明(头文件)以及 方法定义。
  7. duration.cpp:您的输入法在遇到时会堵塞 不是数字或空格的东西,例如“:”。
  8. duration.cpp:您的加法运算符不执行时间算术运算 正确的,特别是溢出。尝试添加“00:59:35” “0点02分三十秒”。
  9. duration.cpp:您的operator==将返回最后一个结果 表达式,因为您使用的是逗号“,”运算符。您 可能想要使用&&或逻辑AND运算符。
  10. duration.cpp:规则3:如果定义构造函数,请复制  构造函数或破坏你应该声明所有3和an  赋值运算符。
  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.

答案 1 :(得分:0)

琐碎的是,在你的主体中你会看到无与伦比的大括号。你的else语句之前应该有一个右括号(即} else {...}

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

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

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

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

您可能需要在标题#include <iostream>中进行正确编译。但是,在包含AlbumCollection.h的任何地方(或调用其相应标头的任何地方),此重载将可用。将程序链接在一起时,将使用先前定义的定义。此外,要实现此目的,您可能需要从定义中删除inline限定符。

请注意,如果这是问题,那么错误输出可能看起来很可怕。如果遇到这个问题,很多编译器错误输出都会消失,调试你可能遇到的任何现有代码编译问题会更加简单。