error LNK2001: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > 的解决办法

标签: 基础知识 标准
5762人阅读 评论(0) 收藏 举报
分类:
#include <iostream>
#include <math.h>
using namespace std;
template<typename T>
class P
{
public:
	P(int n=0){num=n;}
	P(const P<T>& copy){num=copy.num;}
	friend ostream&operator<<(ostream& out,P<T> & obj);
	
private:
	int num;
};
template<typename T>
 ostream&operator<< (ostream& out,P<T> & obj)
{
	out<<obj.num;
	return out;

}
int main(void)
{
	P<int> t(2);
	cout<<t;

	return 0;
}

上述程序中定义了一个模板类,但出现了错误,如下:

1>------ 已启动生成: 项目: class, 配置: Debug Win32 ------
1>正在链接...
1>main6.obj : error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class P<int> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$P@H@@@Z),该符号在函数 _main 中被引用
1>F:\c++\c++ problem collections\class\class\Debug\class.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>生成日志保存在“file://f:\c++\c++ problem collections\class\class\class\Debug\BuildLog.htm”
1>class - 2 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

我觉得这个错误主要是重载std的<<运算符造成。解决办法有两个:

一个是直接在类模版中定义这个友元函数。如下:

#include <iostream>
#include <math.h>
using namespace std;
template<typename T>
class P
{
public:
	P(int n=0){num=n;}
	P(const P<T>& copy){num=copy.num;}
	friend ostream&operator<<(ostream& out,P<T> & obj)
	{
		out<<obj.num;
		return out;

	}
private:
	int num;
};

int main(void)
{
	P<int> t(2);
	cout<<t;

	return 0;
}
另一个是:

<pre name="code" class="cpp">#include <iostream>
#include <math.h>
using namespace std;
template<typename T>
class P
{
public:
	P(int n=0){num=n;}
	P(const P<T>& copy){num=copy.num;}
	friend ostream&operator<< <>(ostream& out,P<T> & obj);//friend ostream&operator<< <T>(ostream& out,P<T> & obj);
private:
	int num;
};
template<typename T>
 ostream&operator<< (ostream& out,P<T> & obj)
{
	out<<obj.num;
	return out;

}
int main(void)
{
	P<int> t(2);
	cout<<t;

	return 0;
}



在声明中要多加一个<T>或者<>,在类外定义时不用加,加上就错了。

以上就提供了两种标准的解决办法。


查看评论

error LNK2019: 无法解析的外部符号 "class std::vector<class std::basic_string<char,struct std::char_traits<cha

error LNK2019: 无法解析的外部符号 "class std::vector,class std::allocator >,class std::allocator,class std::a...
  • xiao_lxl
  • xiao_lxl
  • 2015-05-19 10:22:37
  • 6771

编译osgAudio遇到的'std::basic_ifstream<char,std::char_traits<char>>' : base class undefined

此问题是由于包含目录里的osgDB有自定义的ifstream和ofstream,和std标准库的冲突导致,造成此错误的原因是cmake配置include目录时,把各个模块(如osg、osgViewer...
  • dancing_night
  • dancing_night
  • 2016-12-13 22:27:00
  • 1852

C++的error LNK2019: 无法解析的外部符号编译错误

1>Proxy.obj : error LNK2019: 无法解析的外部符号 __imp__connect@12,该符号在函数 "public: enum ProxyStatus __thiscall...
  • u013476751
  • u013476751
  • 2015-01-07 17:12:02
  • 9096

gcc编译c++程序

原来一直以为gcc是c的linux下的编译器,g++是c++的linux下的编译器,今天偶尔看到一个说明文档,大体内容是gcc已经不单纯的可以编译C语言,它支持C, C++, Objective-C,...
  • huiguixian
  • huiguixian
  • 2011-01-25 12:40:00
  • 21098

LINK2019: unresolved external symbol "__declspec(dllimport) public: class std::basic_string的解决方案

相信很多人遇到过std:string的link2019错误,都没有一个很好的解决方法
  • u012878073
  • u012878073
  • 2015-02-28 11:33:44
  • 2061

error LNK2005: "public: void __thiscall std::basic_ofstream<char,struct std::char_traits<char> >::`v

http://hi.baidu.com/haifeng60902/item/e0641a3d366b25f9a9842828 从这里看到的! vpb记录 ...
  • liying426
  • liying426
  • 2013-06-30 17:05:34
  • 2304

error LNK2019,error LNK2001:无法解析的外部符号

环境:win7 ,vs2010 目的:安装protobuf 问题:     test.pb.obj : error LNK2019: 无法解析的外部符号 "public: virtual __t...
  • helloarm123456
  • helloarm123456
  • 2013-12-10 13:41:11
  • 2416

error LNK2001: 无法解析的外部符号 "public: static class std::vector<class......

vector类型作为class的static成员,需要在class外 define。 如: class MyClass { private: static std::vector my...
  • shenlan282
  • shenlan282
  • 2012-09-18 09:54:40
  • 4481

error C2079: “out”使用未定义的 class“std::basic_ofstream<_Elem,_Traits>”

问题: error C2079: “out”使用未定义的 class“std::basic_ofstream” 解决: #include...
  • ghevinn
  • ghevinn
  • 2014-06-12 17:16:20
  • 7111

error C2664: “void std::basic_fstream<_Elem,_Traits>::open(const wchar_t *,std::ios_base::openmode,

error C2664: “void std::basic_fstream::open(const wchar_t ,std::ios_base::openmode,int)”: 不能将参数 1 从“...
  • happy_xiahuixiax
  • happy_xiahuixiax
  • 2017-05-25 15:22:09
  • 577
    个人资料
    持之以恒
    等级:
    访问量: 34万+
    积分: 4751
    排名: 7613
    个人网站
    最新评论