欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

错误 LNK2019 无法解析的外部符号 “operator<<(ostream&, const Square&)“,函数main中引用了该符号

程序员文章站 2022-06-09 15:59:27
...

1 报错现象
1.1报错全文为:
错误	LNK2019	无法解析的外部符号 “operator<<(ostream&, const Square&)“,函数main中引用了该符号
1.2一般这种报错与是否在正确的位置使用inline有关,
1.2.1operator<<(ostream&, const Square&)的声明位置如下:
(即放在头文件的类Square的定义下方)

//.h
class Square {
public:
	explicit Square(double s =0.0):side(s){}

	double getside()const { return side; }
	double getArea()const { return side * side; }
	double getPerimeter()const { return 4 * side; }

	void print(ostream&out = cout)const
		{out<<"(square"<<getside()<<")"<<endl;}
	bool operator<(const Square& rhs)const
		{return getside()<rhs.getside();}

private:
	double side;
};

ostream& operator<<(ostream& out, const Square& rhs);

1.2.2 operator<<(ostream&, const Square&)的定义放在与头文件同名
的源文件中,定义如下:

//.cpp
//<<
inline ostream& operator<<(ostream& out, const Square& rhs)
{
	rhs.print(out);
	return out;
}

1.2.3 按上述放置<<的声明与定义就会报LNK2019错误。

2 修正
(1)直接将定义放置在类Square的定义下方,且声明为inline。
(2)如下:

//.h
class Square {
public:
	explicit Square(double s =0.0):side(s){}

	double getside()const { return side; }
	double getArea()const { return side * side; }
	double getPerimeter()const { return 4 * side; }

	void print(ostream&out = cout)const
		{out<<"(square"<<getside()<<")"<<endl;}
	bool operator<(const Square& rhs)const
		{return getside()<rhs.getside();}

private:
	double side;
};

//<<
inline ostream& operator<<(ostream& out, const Square& rhs)
{
	rhs.print(out);
	return out;
}
(3)如此,即不会再报错了。