关于C++编译器处理过度封装的问题

问题遇到的现象和发生背景

但是当我试图用类模板实现一个过度封装的数据时却发现编译失败

问题相关代码,请勿粘贴截图
#include<iostream>
using namespace std;
template <typename T>class some {
public:
    T t;
    some(T tt):t(tt) {}
    friend ostream& operator<<(ostream& os, some s)
    {
        os << s.t;
        return os;
    }
};
template<typename T>
void it(T t);
int i = 1;
int main()
{
    int a = 0;
    it(a);
}
template<typename T>
void it(T t)
{
    if (i > 0) {
        i--;
        cout << t;
        some<T> s(t);
        it(s);
    }
    return;
}


运行结果及报错内容

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C1202 递归类型或函数依赖项上下文太复杂

我的解答思路和尝试过的方法

尝试把封装的次数降低,但是即使只要一次封装,这个用来进一步封装的函数都会报错

我想要达到的结果

至少让它编译通过吧,最好同时回答一下“编译器会不会对简单的过度封装的数据进行优化”这个问题

模板参数不是得编译期间确定吗,你这个编译期间又没法确定递归层数,就无法确定模板参数

template<typename T>
void it(T t)
{
    some<T> s(t);
    it(s);
    return;
}

这会导致无限递归,
有时间搞这种乱七八糟的东西,还不如先把语法学好,就知道为啥会递归了

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

i--放到27行之前,在递归调用前进行i值修改,否则你是个死循环嵌套啊,i值永远大于0


template <class T>
class some
{
public:
    T t;
    some(T tt) : t(tt) {}
    friend ostream &operator<<(ostream &os, some &s) //
    {
        os << s.t;
        return os;
    }
};

template <typename T>
void it(T t);

int i = 1;
int main()
{
    int a = 5;
    it(a);
}

template <typename T>
void it(T t)
{
    if (t > 0)
    {
        some<T> s(t);
        cout << s;        
        it(--t);        
    }
    return;
}