C++ 在一个类中声明一个友元函数,为什么这个声明的友元函数名和类型不可见

#include <iostream>
#include <vector>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::istream;
using std::ostream;
class screen
{
public:
using pos = std::string::size_type;
screen() = default;
screen(const pos &a, const pos &b): hei(a), wid(b), con(a * b, ' ') {}
screen(const pos &a, const pos &b, const char &c): hei(a), wid(b), con(0, c) {}

friend void win::clear1(scr); //为什么这里的 WIN和SCR不可见 我已经在下面定义了啊 难道还要在 SCREEN类前面在声明一次吗?

char get()const
{
return con[cur];
}
char get(const pos &a, const pos &b )const;
screen &move1(const pos &a1, const pos &a2);

screen &set1(char);
screen &set1(pos, pos, char);

screen &display(ostream &os)
{
do_display(os);
return *this;
}
const screen &display(ostream &os)const
{
do_display(os);
return *this;
}

private:
void do_display(ostream &os)const
{
os << con;
}
pos cur = 0;
pos hei = 0, wid = 0;
string con;

};
class win

{
public:
using scr = std::vector<screen>::size_type;

void clear1(scr);

private:
vector<screen> screens{screen(24, 80, 'a')};
};

void win::clear1(scr i)
{
screen &s = screens[i];
s.con = string(s.hei * s.wid, ' ');
}

第1个回答  推荐于2016-11-05
友元的概念你弄混了。
友元的含义并不是取代前置声明,而是告诉一个类可以访问另一个类的内部私有成员(protected、private),是实际调用类方法、类属性时的一个权限问题。
而这里说找不到win、scr,是因为你的class win声明在screen后面,screen不知道有win的存在,你需要在class screen前面放前置声明class win;追问

我在前面放置了class win, 但是friend void win::clear1(scr);这句里面的SCR依旧找不到 我加了win::scr还是报错

追答

clear1方法的参数类型scr,是在win类里声明的,screen并不知道,友元是解释权限的,与声明的解释无关;那么你就应该把这个scr声明也要前置。而win::scr是一种静态引用方法,在win类里,scr显然并非静态成员。这里涉及到类声明内部使用using语法,你这样用我感觉还是有点罕见,个人建议你可以把using scr = std::vector::size_type;这一行移到文件开头,而不是放在class win里面。

本回答被提问者和网友采纳
相似回答
大家正在搜