【问题标题】:c++ istream operator overloading unresolvedc++ istream 运算符重载未解决
【发布时间】:2021-08-07 15:27:04
【问题描述】:

source.h:

#include <iostream>
class date{
public:
std::string str_time;
friend std::istream& operator >> (std::istream& para_stream, date& para_date);
};

source.cpp:

#include "source.h"
std::istream& operator >> (std::istream& para_stream, date& para_date)
{
  istream >> para_date.str_time;
  return istream;
}

错误: 错误 2 error LNK2019: unresolved external symbol "class std::basic_istream & __cdecl src::operator>>(class std::basic_istream &,class src ::date &)" (??5src@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV12@AAVdate@0@@Z) 在函数 "public: bool __thiscall src: :DB::del_vouc(int const &)" (?del_vouc@DB@src@@QAE_NABH@Z) C:\Users\Dell\Documents\Visual Studio 2013\Projects\foodstore\foodstore\DB.obj foodstore

【问题讨论】:

  • 您忘记链接定义。它与重载、运算符或istream 无关。
  • 错误是关于数据库对象文件 - 你是如何构建你的东西​​的?
  • 这能回答你的问题吗? LNK2019 error c++ unresolved external symbol
  • @doctorlove 是的,我也知道,但是当我删除这个运算符重载函数时,它不会出错。
  • 您真的应该阅读 anatolyg 评论中的帖子。 include 关键字仅在编译时加载包含文件。但是要构建一个可执行文件,您必须将source.o 与您的主要源链接。

标签: c++ overloading operator-keyword istream


【解决方案1】:
istream >> para_date.str_time;
return istream;

这两行应该是:

para_stream >> para_date.str_time;  // para_stream is the object of class istream 
return para_stream ;

您应该使用类para_stream 的对象,而不是类。修改后,在我的系统中编译成功。

【讨论】:

  • 我已经完成了,但仍然显示未解决
  • @TrisYang 它在我的系统中工作。我正在使用 Windows 10。
  • @TrisYang 代码相同,有两处修改,答案中提到
  • 你把文件分开了吗? (Cpp 和标题)
  • @TrisYang 是的,我确实分开了两个文件
【解决方案2】:

链接器抱怨 src::DB 有一个“未解析的外部符号”

您在 source.cpp 中定义了一个函数,因此它保留在该文件的内部(翻译单元)。

如果在头文件中添加声明,像这样

std::istream& operator >> (std::istream& para_stream, date& para_date);

它在外部可用,而不是“隐藏”在 cpp 文件中。

或者,您可以在头文件中定义(而不仅仅是声明)它,但必须将其标记为内联,否则每次包含头文件时都会得到一个定义。

【讨论】:

  • 但是,如果我想在外部执行此操作呢?这可能吗?
  • 我不清楚你的意思 - 你需要导出一个符号(通过标题)让其他文件在链接过程中找到它
猜你喜欢
  • 2011-09-23
  • 2020-02-10
  • 2021-12-16
  • 1970-01-01
  • 2013-10-10
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多