24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 588  |  回复: 4
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

lixy1217

木虫 (著名写手)

[求助] 关于C++类模板的问题 已有2人参与

如果我定义了一个类模板 A<type>,
那么会出现一个问题,就是A<double> 不能调用A<int>里的私有变量
当然可以定义一个friend A<double>,就可以了


但问题是,我希望所有类型的 A 模板都可以调用任何其它类型 A 模板的私有变量,请问这一点能做到吗?
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

偶尔敞开心扉,世界将不再孤独
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

几罗星人

新虫 (初入文坛)

【答案】应助回帖

使用template<class Typ> friend class A;的语法就可以绑定类模板的全部实例。

给出一个参考程序。
#include <iostream>
using namespace std;

template<class T>
class A
{
        template<class Typ> friend class A;
public:
        template<class Typ>
        Typ somefunc(A<Typ>& obj)
        {
                return obj.k;
        }

private:
        T k;
};

int main()
{
        A<int> ai;
        A<double> ad;

        cout<< ad.somefunc(ai);

        system("pause";
        return 0;
}

在Visual Studio 2013中编译通过
3楼2016-02-24 01:55:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 5 个回答

baghnac

金虫 (小有名气)

【答案】应助回帖

从模板函数分析,私有变量有:
  1. 局部变量
  2. 静态变量

局部变量:
局部变量是运行时在堆栈里的,每次运行都不一定一样
也就是说可能会同时运行两个A<int>,而里面的局部变量值不一样,这与type无关

静态变量:
从现象来看,由于不同类型实际上是不同函数签名的函数,所以不同函数里的静态变量是独立的,不能互相访问
除非改成全局的
-------------------------------------------------------------------------
模板类型以上类似,感觉也是生成两个不同的实例,所以其私有变量是不能相互访问的,否则就不是私有变量了
Beagreathackernotacracker!
2楼2016-02-06 09:26:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

几罗星人

新虫 (初入文坛)

【答案】应助回帖

★ ★ ★ ★ ★
lixy1217: 金币+5, 有帮助, 呵呵,我已经知道这个了,其实解决的方法就是这么简单,还是感谢参与~~ 2016-02-24 11:58:02
打错了。直接用friend class A;就可以了。而在B类友元A类所有实例我记得好像也是可以的,突然忘了。
4楼2016-02-24 02:03:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

几罗星人

新虫 (初入文坛)

【答案】应助回帖

想起来了。如果是友元自己,就不需要用template关键字,虽然用了也不错。友元别的模板类的全部实例。就需要使用template,而且模板参数的名字不与当前类的模板参数名字一样。就像我3楼的程序。

#include <iostream>
using namespace std;

template<class T>
class A
{
        friend class A;
        template<class Typ> friend class B; // 友元B的全部实例,模板参数Typ与A的模板参数T不一样即可。
public:
        template<class Typ>
        Typ somefunc(A<Typ>& obj)
        {
                return obj.k;
        }

private:
        T k;
};


template<class T>
class B
{
public:
        template<class Typ>
        Typ somefunc2(A<Typ>& obj)
        {
                return obj.k;
        }

private:
        T k;
};


int main()
{
        A<int> ai;
        B<double> ad;

        cout << ad.somefunc2(ai);

        system("pause";
        return 0;
}

也是在Visual Studio 2013中编译通过。这种称为非绑定友元。
5楼2016-02-24 02:18:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 调剂 +3 好好读书。 2026-04-01 6/300 2026-04-02 15:49 by liumengping
[考研] 321求调剂 一志愿 浙江工业大学生物医药 +5 嘿嘿HC 2026-04-01 6/300 2026-04-02 15:23 by sophie2180
[考研] 找调剂 +6 楚乔乔 2026-04-01 6/300 2026-04-02 12:06 by xiaoranmu
[考研] 324分 085600材料与化工 +20 呆鹅oor 2026-03-27 20/1000 2026-04-02 10:13 by oooqiao
[考研] 367求调剂 +8 芋泥啵啵… 2026-03-28 8/400 2026-04-02 09:20 by olim
[考研] 生物学327,求调剂 +5 书上的梅子 2026-04-01 6/300 2026-04-02 06:47 by ilovexiaobin
[考研] 284求调剂 +12 小熊~~ 2026-03-31 12/600 2026-04-01 20:23 by 花??
[考研] 一志愿西安交大材料学硕(英一数二)347,求调剂到高分子/材料相关专业 +7 zju51 2026-03-31 9/450 2026-04-01 19:35 by CFQZAFU
[考研] 求调剂 +5 零八# 2026-03-27 5/250 2026-04-01 14:40 by yulian1987
[考研] 一志愿南昌大学324求调剂 +7 hanamiko 2026-03-30 7/350 2026-04-01 13:22 by JourneyLucky
[考研] 358求调剂 +3 王向阳花 2026-03-31 3/150 2026-04-01 09:56 by zzchen2000
[考研] 复试调剂 +7 双马尾痞老板2 2026-03-31 7/350 2026-03-31 19:49 by Dyhoer
[考研] 085601英二数二求调剂 总分325 +4 余航航 2026-03-31 4/200 2026-03-31 17:38 by 唐沐儿
[考研] 物理学调剂 +4 小羊36 2026-03-30 4/200 2026-03-31 16:16 by lishahe
[考研] 南京大学化学调剂 +11 景随风 2026-03-29 16/800 2026-03-31 10:14 by herarysara
[考研] 085601一志愿西北工业大学初试346 +4 085601初试346 2026-03-30 4/200 2026-03-31 07:47 by jp9609
[考研] 一志愿华中师范化学332分求调剂 +3 Lyy930824@ 2026-03-29 3/150 2026-03-30 20:15 by DHUSHUAI
[考研] 0703化学321分求调剂 +10 三dd. 2026-03-30 11/550 2026-03-30 19:24 by markhwc
[考研] 求佛 +7 迷人的哈哈 2026-03-28 7/350 2026-03-28 16:47 by 催化大白
[考研] 352分 化工与材料 +5 海纳百川Ly 2026-03-27 5/250 2026-03-28 03:39 by fmesaito
信息提示
请填处理意见