最近用c++解决八皇后问题,定义了一个chessboard
类,类中定义了友元operator<<
使其能用cout
输出。 在 chessboard.h 中就是这样:
1 |
|
但老是编译不过, LINK2005 错误什么的。
百度之,都建议把友元函数的定义直接写在类声明里,我试了试的确可以解决这个问题。
有人说是using namespace std
语句的问题,但当我把各文件中#include "chessboard.h"
放在using
语句的后面,问题依然存在。 后来我将operator<<
的定义单独放在 chessboard.cpp 中,也能编译过。 这真是个BUG,预处理器处理后应该只有一份operator<<
的定义,但显然VS进行了某些奇怪的优化,造成了混乱,#ifndef
都没用,而且经试验用#pragma once
也不行。
————————20180304 更新————————
我错怪VS了……我在两个.cpp文件中 include 了 chessboard.h ,又没有将operator<<
声明为静态或内联,当然会有两份可外链接的operator<<
定义从而产生冲突……