C++ C++;将ostream运算符重载为友元会导致错误:变量在此上下文中是私有的
我抓不住这个错误,一定很容易。我有一个头文件(snim.h):C++ C++;将ostream运算符重载为友元会导致错误:变量在此上下文中是私有的,c++,C++,我抓不住这个错误,一定很容易。我有一个头文件(snim.h): \ifndef SNIM\u CLASS\h_ #定义SNIM_类_ #包括 名称空间snim{ 斯尼莫代尔级{ int communitySize;//社区的总大小 公众: SnimModel(intc):communitySize(c){}; friend std::ostream&operator如果在全局名称空间中定义了另一个运算符,它应该位于名称空间snim std::ostream& snim::operator
\ifndef SNIM\u CLASS\h_
#定义SNIM_类_
#包括
名称空间snim{
斯尼莫代尔级{
int communitySize;//社区的总大小
公众:
SnimModel(intc):communitySize(c){};
friend std::ostream&operator如果在全局名称空间中定义了另一个运算符,它应该位于名称空间snim
std::ostream& snim::operator<<(std::ostream& os, const SnimModel& s)
{
// ...
}
std::ostream&snim::operator在全局名称空间中定义另一个运算符,它应该位于名称空间snim
std::ostream& snim::operator<<(std::ostream& os, const SnimModel& s)
{
// ...
}
std::ostream&snim::operator要添加到此回复中,命名空间内的类中的友元定义引用(函数/运算符)在名称空间中,而不是在全局名称空间中的定义。在本例中,snim
namespace我认为您不能简单地通过前缀将函数定义为名称空间的一部分,对吗?您实际上不需要将其包围在名称空间块中吗?@BenjaminLindley:这两种方法都是可能的。我为其中的一种方法添加了一个链接演示你有疑问。如果这是允许的,那么我想用-pedantic errors
标志报告错误是GCC的错误。@BenjaminLindley:clang,msvc和GCC接受它。GCC只会产生警告,因为它在给定的命名空间中找不到运算符的声明(因为函数声明来自friend
)并提供声明以删除警告。要添加到此回复,命名空间内的类中的友元定义引用(函数/运算符)在名称空间中,而不是在全局名称空间中的定义。在本例中,snim
namespace我认为您不能简单地通过前缀将函数定义为名称空间的一部分,对吗?您实际上不需要将其包围在名称空间块中吗?@BenjaminLindley:这两种方法都是可能的。我为其中的一种方法添加了一个链接演示你有疑问。如果这是允许的,那么我想用-pedantic errors
标志报告错误是GCC的错误。@BenjaminLindley:clang,msvc和GCC接受它。GCC只会产生警告,因为它在给定的命名空间中找不到运算符的声明(因为函数声明来自friend
)并提供声明以消除警告。
In function ‘std::ostream& operator<<(std::ostream&, const snim::SnimModel&)’:
snim.cpp:9:11: error: ‘int snim::SnimModel::communitySize’ is private within this context
os << s.communitySize << "]\n";
std::ostream& snim::operator<<(std::ostream& os, const SnimModel& s)
{
// ...
}
namespace snim
{
std::ostream& operator<<(std::ostream& os, const SnimModel& s)
{
// ...
}
}