error C2649: “typename”: 不是“class”的解决方法
目录1.现象2.解决方法3.延申其他模板类友元场景4.总结1.现象我们定义了一个模版类代码如下templatetypename X class CShortWaveLinkProProtocol { friend class X; public: explicit CShortWaveLinkProProtocol() {} virtual ~CShortWaveLinkProProtocol() {} private: void setNTR(bool bNTR) {} };出现编译报错2.解决方法把代码friend class X;修改为friend typename X; 或 friend X; // ✅ 让模板参数X的类型成为友元注意friend T;仅当T是类 / 结构体 / 联合类型时有效若T是基本类型如int或指针类型会编译报错。即可重新编译 OK。3.延申其他模板类友元场景如果你的友元不是模板参数而是其他模板类有两种常见写法场景 1让特定实例的模板类成为友元// 前向声明友元模板类 template typename U class FriendTemplate; template typename T class MyClass { friend class FriendTemplateT; // ✅ 仅 FriendTemplateT 是友元 };场景 2让所有实例的模板类成为友元template typename U class FriendTemplate; template typename T class MyClass { // ✅ FriendTemplate的所有实例FriendTemplateint、FriendTemplatefloat等都是友元 template typename U friend class FriendTemplate; };4.总结若想让模板参数T成为友元用friend T;不要加class。若想声明外部模板类为友元需先前向声明模板类再用friend class 模板类名实例;或template typename U friend class 模板类名;。