我今天整天都对我的代码感到难过。我有很多课程来处理一系列曲目和专辑。 我的代码编译并成功读入文件,但是一旦我尝试使用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
我真的很感激一些帮助。它变得令人沮丧。我的书和谷歌都没有任何消息。谢谢你的时间。
答案 0 :(得分:0)
一些问题:
if (file)
代替if (file.is_open())
}
声明中错过了结束if
。argc
或argv
,因此您可以声明main
为main(void)
。operator==
将返回最后一个结果
表达式,因为您使用的是逗号“,”运算符。您
可能想要使用&&
或逻辑AND运算符。operator+
或
operator-
您还应该将运算符+=
和-=
实现为
好。请参阅Boost数学库。<, <=, ==, !=, >,
和>=
。暗示:
将时间转换为秒,这将使您的生活更轻松
比较时。请参阅boost :: less_than_comparable。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
限定符。
请注意,如果这是问题,那么错误输出可能看起来很可怕。如果遇到这个问题,很多编译器错误输出都会消失,调试你可能遇到的任何现有代码编译问题会更加简单。