将 声明operator<<
为类中的朋友,但将其定义为static
文件中您希望它可用的位置。
这确实有一个小缺点:尝试在您定义它的文件之外使用它只会导致链接器错误,而不是您真正喜欢的编译器错误。另一方面,这仍然比没有保护要好得多。
这是一个快速演示。首先,带有类定义的头文件,并声明一个junk
我们将用来测试对操作符的访问的函数:
// trash.h
#include <iostream>
class X {
friend std::ostream &operator<<(std::ostream &, X const &);
};
void junk(X const &);
然后是我们定义的文件X
和操作符,所以我们应该可以从这里访问操作符:
#include "trash.h"
static std::ostream &operator<<(std::ostream &os, X const &x) {
return os << "x";
}
int main() {
X x;
std::cout << x;
junk(x);
return 0;
}
然后是不应该访问操作员的第二个文件:
#include "trash.h"
void junk(X const &x) {
// un-comment the following, and the file won't link:
//std::cout << x;
}
请注意,在这种情况下,我们不能使用匿名命名空间来代替文件级static
函数——如果您尝试,它会显示为 的模棱两可的重载operator<<
,即使在我们想要允许的情况下也是如此。