24小时热门版块排行榜    

查看: 659  |  回复: 4

lixy1217

木虫 (著名写手)

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

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


但问题是,我希望所有类型的 A 模板都可以调用任何其它类型 A 模板的私有变量,请问这一点能做到吗?
回复此楼
偶尔敞开心扉,世界将不再孤独
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

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的回帖

几罗星人

新虫 (初入文坛)

【答案】应助回帖

想起来了。如果是友元自己,就不需要用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的回帖
相关版块跳转 我要订阅楼主 lixy1217 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 我的国基提前知道中了,可是同事的操作让我实在接受不了,怎么会有这样的人 +10 家与远方 2026-08-10 15/750 2026-08-14 02:08 by 绵羊哥哥
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +3 启萌科技 2026-08-12 11/550 2026-08-13 22:57 by 启萌科技
[文学芳草园] 阿姨 +4 汪汪锅 2026-08-09 4/200 2026-08-13 19:43 by arzu_hma
[基金申请] 有时候,自然基金真的不能太认真 (我的申报经验) +4 majunge000 2026-08-11 6/300 2026-08-13 16:50 by 四季常青藤
[基金申请] filecode +14 documentary 2026-08-10 16/800 2026-08-13 16:39 by 润生71
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] 分享一下我之前已中青C的计划书的filecode +4 布布和一二 2026-08-11 5/250 2026-08-13 12:56 by cratir
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
[基金申请] 综述论文作为代表作会不会影响评审专家的印象分? +11 yufeiwaner 2026-08-09 13/650 2026-08-12 08:17 by yufeiwaner
[基金申请] 是这周出结果还是下周出结果? +3 yuleib84 2026-08-11 3/150 2026-08-11 21:53 by jnhyjjm
[硕博家园] 读博的好处 +3 lnee 2026-08-11 3/150 2026-08-11 18:10 by 希望我好好的
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
[基金申请] 关于代码变化问题,想知道的进来 +17 且听虎啸 2026-08-07 24/1200 2026-08-10 18:35 by zhangduo2008
[基金申请] 据悉今年马上要出结果了 +7 瞬息宇宙 2026-08-10 8/400 2026-08-10 12:42 by Vivilian
[基金申请] 这样的filecode谁见过 +11 布布和一二 2026-08-08 22/1100 2026-08-10 11:10 by wmfsnow
[基金申请] 关于filecode,很负责任的告诉大家 +6 爱看书的可乐 2026-08-08 7/350 2026-08-08 22:13 by a_niu
[基金申请] 关于filecode +4 布布和一二 2026-08-07 7/350 2026-08-07 22:55 by zhanghaozhu
[基金申请] 化学口download_prp&amp;fileCode的固定段好像这几天一直没变,有变的大神么? +3 Tide man 2026-08-07 4/200 2026-08-07 22:39 by Tide man
[基金申请] filecode变化情况 +6 布布和一二 2026-08-07 22/1100 2026-08-07 14:45 by 且听虎啸
信息提示
请填处理意见