24小时热门版块排行榜    

查看: 651  |  回复: 4
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

lixy1217

木虫 (著名写手)

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

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


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

» 猜你喜欢

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

偶尔敞开心扉,世界将不再孤独
已阅   回复此楼   关注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的回帖
查看全部 5 个回答

baghnac

金虫 (小有名气)

【答案】应助回帖

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

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

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

几罗星人

新虫 (初入文坛)

【答案】应助回帖

★ ★ ★ ★ ★
lixy1217: 金币+5, 有帮助, 呵呵,我已经知道这个了,其实解决的方法就是这么简单,还是感谢参与~~ 2016-02-24 11:58:02
打错了。直接用friend class A;就可以了。而在B类友元A类所有实例我记得好像也是可以的,突然忘了。
4楼2016-02-24 02:03:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 面上项目filecode邪修 +4 西山十月 2026-08-09 6/300 2026-08-10 00:16 by liufeng0619
[基金申请] 2026国自然放榜时间 +4 布布和一二 2026-08-08 4/200 2026-08-09 22:24 by otj2008
[基金申请] 关于代码变化问题,想知道的进来 +15 且听虎啸 2026-08-07 22/1100 2026-08-09 22:13 by 布布和一二
[基金申请] 这样的filecode谁见过 +10 布布和一二 2026-08-08 21/1050 2026-08-09 17:21 by 天神眷顾
[基金申请] filecode与中标关系的预测 +5 布布和一二 2026-08-07 5/250 2026-08-09 16:15 by 袁向阳007
[基金申请] fileCode有新解读? +10 Tide man 2026-08-08 18/900 2026-08-09 12:55 by 仁砚薪传
[基金申请] 关于豆爷回答的JTJC与%2F数量 +5 yang182083 2026-08-06 7/350 2026-08-08 18:29 by zhanghaozhu
[基金申请] 好奇怪的filecode +3 布布和一二 2026-08-08 4/200 2026-08-08 17:46 by zhanghaozhu
[基金申请] 基金中了 +14 laoda193707 2026-08-06 14/700 2026-08-08 00:23 by 实验小白ha
[基金申请] 娱乐 +6 Tide man 2026-08-03 6/300 2026-08-07 22:40 by 铁帽子农民
[基金申请] 化学口download_prp&amp;fileCode的固定段好像这几天一直没变,有变的大神么? +3 Tide man 2026-08-07 4/200 2026-08-07 22:39 by Tide man
[基金申请] 听说今天filecode变了 +24 布布和一二 2026-08-06 47/2350 2026-08-07 16:02 by zhiyanjiang
[基金申请] 大家散了吧,后缀研究没有意义,别浪费时间了,过好目前的每一天,不要焦虑 +5 Tide man 2026-08-06 7/350 2026-08-07 13:11 by 医学老男孩
[基金申请] filecode +14 等待解的谜 2026-08-06 19/950 2026-08-07 12:20 by wlwhappy
[基金申请] filecode +8 布布和一二 2026-08-06 11/550 2026-08-06 20:41 by tangpu318
[基金申请] 求各位大神看下 100+6 hpkpkpkp 2026-08-05 33/1650 2026-08-06 14:49 by zhiyanjiang
[基金申请] 影响面上的因素 +8 布布和一二 2026-08-05 11/550 2026-08-06 10:41 by 宝贝虫子
[基金申请] 8月时间戳变的,举个手。玩一下,释放压力 +9 archvillain 2026-08-04 11/550 2026-08-05 20:06 by wlwhappy
[基金申请] 好消息?这个有何含义??? +8 Tide man 2026-08-05 10/500 2026-08-05 16:14 by xmuxiaoyu
[基金申请] 什么时候能放榜呀? +3 Jacob678 2026-08-03 3/150 2026-08-03 16:14 by gltch
信息提示
请填处理意见