Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将ostream运算符重载为友元会导致错误:变量在此上下文中是私有的_C++ - Fatal编程技术网

C++ C++;将ostream运算符重载为友元会导致错误:变量在此上下文中是私有的

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

我抓不住这个错误,一定很容易。我有一个头文件(snim.h):

\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)
    {
        // ...
    }
}