VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1534|回复: 14

类模板问题 ver2

[复制链接]

3

主题

10

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-3-21 15:00:01 | 显示全部楼层 |阅读模式
template<int i1,int i2>
class One
{
        template<int i1,int i2> friend ostream& operator<<(ostream&,const One<i1,i2>&);
        template<int i1,int i2> friend void fun2(const One<i1,i2>&);
};

template<int i1,int i2> ostream& operator<<(ostream&,const One<i1,i2>&){}
template<int i1,int i2> void fun2(const One<i1,i2>&){}

template<class T>
class Two
{
        template<class T> friend ostream& operator<<(ostream&,const Two<T>&);
        template<class T> friend void fun1(const Two<T>&);

};

template<class T> ostream& operator<<(ostream&,const Two<T>&){}
template<class T> void fun1(const Two<T>&){}

除了 fun1 其它3个函数都有2义性

怎么解决?
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-7-1 18:45:01 | 显示全部楼层
在class One的两个友元函数中,参数表的One<i1,i2>的t1和t2是用的外层class One的模板参数,
还是友元声明中的参数列表??????另外你声明友元的时候,因为没有提前的声明,造成编译器无法
知道你放在那里的友元是什么东西!!!

你要的可能是(class Two我就不帮你改了,类似的):
//先是三个提前的声明(forward declaration)
template<int i1,int i2>
class One;
template<int i1,int i2>
ostream& operator<<(ostream&,const One<i1,i2>&);
template<int i1,int i2>
void fun2(const One<i1,i2>&);


template<int i1,int i2>
class One
{
                friend  ostream& operator << <i1, i2>(ostream&, const One<i1,i2>&);
                friend  void fun2<i1, i2>(const One<i1,i2>&);
};

template<int i1,int i2>
ostream& operator<<(ostream&,const One<i1,i2>&)
{
}


template<int i1,int i2>
void fun2(const One<i1,i2>&)
{
}
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-7-1 21:00:01 | 显示全部楼层
你想要的还可能是(注意模板参数的大小写):
#include <iostream>
using namespace std;


template<int i1,int i2>
class One;

template<int i1,int i2>
ostream& operator<<(ostream&,const One<i1,i2>&);


template<int i1,int i2>
void fun2(const One<i1,i2>&);


template<int i1,int i2>
class One
{
        template <int I1, int I2>
                friend  ostream& operator << (ostream&, const One<I1,I2>&);
        template <int I1, int I2>
                friend  void fun2(const One<I1,I2>&);
};

template<int i1,int i2>
ostream& operator<<(ostream&,const One<i1,i2>&)
{
}


template<int i1,int i2>
void fun2(const One<i1,i2>&)
{
}
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-7-1 22:45:01 | 显示全部楼层
像这样的语法问题,我建议你,好好看看《c++ templates》,实在没必要在语法还搞不清楚的情况下,
跟编译器较劲
回复

使用道具 举报

3

主题

10

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-7-2 13:30:02 | 显示全部楼层
我要的当然不是你的答案 , 你说的那些我明白

我只是想 理解 为什么那样声明和定义 同一个函数

编译器会认为是两个不同的函数

还有 我定义的语法只是 奇怪 但并不是错误

要的效果 就是 让函数模板的任意实例访问类模板的任意实例而已

但目前看来 声明了以后 却不知道如何定义了

怪我没说明白 不好意思了!
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-7-4 13:15:01 | 显示全部楼层
你怎么不仔细看我的第二个回帖呢,那就满足你的要求了
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-7-5 14:00:01 | 显示全部楼层
最后给你一个版本,如果不是你想要的,那我也懒得再说了
#include <iostream>
using namespace std;

template<int T1,int T2>
class One;

template<int i1,int i2, int T1, int T2>
void fun2(const One<T1,T2>&);

template<int T1,int T2>
class One
{
        const static int NUM = 18;

        template<int i1,int i2, int A1, int A2>
        friend void fun2(const One<A1,A2>&);
};


template<int i1,int i2, int T1, int T2>
void fun2(const One<T1,T2>&)
{
        cout
                << "One<" << T1 << ", " << T2 << ">::NUM=" << ( One<T1,T2>::NUM )
                << "\nviewing from\n\tfun2<" << i1 << ", " << i2 << ", "  << T1 << ", " << T2 << ">\n"<< endl;
}


int main()
{
        One<1, 1> one11;
        One<2, 4> one24;
        fun2<2, 3>(one11);
        fun2<5, 6>(one11);
        fun2<7, 8>(one11);
        fun2<7, 8>(one24);

}
回复

使用道具 举报

3

主题

10

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-7-9 16:30:01 | 显示全部楼层
我看了 而且之前我已经试过 你的第二个回帖那个方法

依然是重载不明确 二义性

不知道 你给出代码的同时有没有在自己的编译器上 试一下呢?

如果真是那么容易解决的话 我也不会在这上面浪费大家的脑细胞阿!
回复

使用道具 举报

3

主题

10

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-7-9 23:15:01 | 显示全部楼层
你的最后一个方法 我试过了

还是 重载不明确 问题没解决

而且 你给出的这个方法 比我的还奇特阿 呵呵
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-10 14:15:01 | 显示全部楼层
真是奇怪,我编译了一下661193给出的程序 竟然能够通过啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表