autorelease

1.autorelease的基本用法
  • 会将对象放到一个自动释放池中
  • 当自动释放池被销毁时,会对池子里的所有对象做一次release操作
  • 会返回对象本身
  • 调用完autorelease方法不会对对象的引用计数器产生影响
2.autorelease的好处

不用再关心对象的释放时间

3.autorelease的使用注意
  • 占用内存较大的对象尽量不用autorelease
  • 不能连续调用autorelease或者调用autorelease后又调用release方法
  • 系统自带的方法里面没有alloc/new/copy的,说明返回的对象都是autorelease的
  • 没有创建自动释放池,但是调用了autorelease方法,这样是没有效果的

 

 

 

 

转载于:https://my.oschina.net/jlongtian/blog/830969

<think>我们在处理模板类中的嵌套类静态成员声明时,可能会遇到需要添加`typename`的情况。错误信息通常为:`need ‘typename’ before ... because ... is a dependent scope`。这是因为在模板中,编译器无法确定嵌套类的类型,除非我们使用`typename`关键字来显式说明这是一个类型。 根据你提供的错误信息:`need ‘typename’ before A<T>::AutoRelease because A<T> is a dependent scope`,我们可以推断,在类外声明静态成员时,没有正确使用`typename`关键字。 下面是一个示例模板类,其中包含一个嵌套类`AutoRelease`,并且我们想要在类外定义`AutoRelease`的一个静态成员。 错误示例: ```cpp template <typename T> class A { public: class AutoRelease; // 嵌套类的声明 static AutoRelease ar; // 静态成员声明 }; // 在类外定义嵌套类 template <typename T> class A<T>::AutoRelease { // ... 成员定义 }; // 错误的静态成员定义:缺少typename template <typename T> A<T>::AutoRelease A<T>::ar; // 这里会报错 ``` 正确的方式是在定义静态成员时,在类型说明符前添加`typename`关键字,因为`A<T>::AutoRelease`是一个依赖作用域的类型名(即依赖于模板参数T),编译器在没有实例化模板之前无法确定它是否是一个类型。因此,我们需要明确告诉编译器这是一个类型。 修正后的定义: ```cpp template <typename T> typename A<T>::AutoRelease A<T>::ar; ``` 这里,`typename`关键字用于告诉编译器`A<T>::AutoRelease`是一个类型。 因此,针对你的问题,在类外声明嵌套类的静态成员时,应该在静态成员的类型前面加上`typename`关键字,以指示该嵌套类是一个类型。 另外,注意静态成员的定义需要在全局作用域(或命名空间作用域)中进行,并且对于模板类,每个静态成员的定义本身也是一个模板定义。 如果静态成员需要在编译时初始化,并且是整型或枚举类型,可以在类内直接初始化(C++11起允许类内初始化非const静态成员,但通常还是需要在类外定义以分配存储空间)。但对于非整型的静态成员,通常需要在类外定义。 总结:在模板类外定义嵌套类的静态成员时,需要: 1. 使用`template <typename T>`开始定义。 2. 在类型名前使用`typename`关键字指明嵌套类是一个类型。 3. 按照`类型 类名<模板参数>::静态成员名`的格式定义。 这样,就可以解决上述错误。 相关问题: 1. 在C++模板中,何时需要使用`typename`关键字? 2. 模板类中的静态成员初始化有什么特殊要求? 3. 嵌套类在模板类中有什么特殊注意事项? 4. 如何理解“dependent scope”在C++模板中的含义?</think>### 解决C++模板类嵌套类静态成员声明错误 在C++中,当在模板类外部声明嵌套类的静态成员时,遇到`need 'typename' before ... because ... is a dependent scope`错误,是因为编译器无法确定嵌套类是否属于类型。以下是解决方案: #### 错误原因分析 1. **依赖作用域(Dependent Scope)** 模板类`A<T>`中的`AutoRelease`是依赖于模板参数`T`的嵌套类型 2. **编译器无法自动推断类型** 在模板实例化前,编译器无法确定`A<T>::AutoRelease`是否表示类型(可能被特化为非类型成员) 3. **缺少`typename`关键字** 必须显式告知编译器这是类型而非静态成员或变量 #### 正确解决方案 在静态成员声明前添加`typename`关键字: ```cpp template<typename T> class A { public: class AutoRelease; // 嵌套类声明 static AutoRelease ar; // 静态成员声明 }; // 嵌套类定义 template<typename T> class A<T>::AutoRelease { // 类实现... }; // ✅ 正确静态成员定义(关键修改) template<typename T> typename A<T>::AutoRelease A<T>::ar; // 添加typename ``` #### 关键说明 1. `typename`的作用: 明确告知编译器`A<T>::AutoRelease`是一个类型而非成员变量 2. 语法要求: - 只能用于模板定义中 - 必须放在完整限定名称前 - 不能用于基础数据类型(如`int`/`double`) 3. 特例情况: 如果嵌套类在基类中定义,可能需要额外添加`template`关键字: ```cpp template<typename T> typename A<T>::template AutoRelease A<T>::ar; ``` #### 错误示例对比 ```cpp // ❌ 错误写法(缺少typename) template<typename T> A<T>::AutoRelease A<T>::ar; // 触发编译错误 ``` > **根本原因**:C++标准规定,在模板的依赖作用域中,编译器默认将嵌套名称视为非类型(除非使用`typename`显式声明)[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值