您现在的位置是:首页 >学无止境 >Effective C++读书笔记——item42(typename的两个含义)网站首页学无止境
Effective C++读书笔记——item42(typename的两个含义)
简介Effective C++读书笔记——item42(typename的两个含义)
- 声明模板类型参数:在声明模板类型参数时,
class和typename含义完全相同,可以互换使用。template<class T> class Widget1; // 使用 "class" template<typename T> class Widget2; // 使用 "typename" - 标识嵌套依赖类型名:在模板中,当涉及到嵌套依赖类型名时,必须使用
typename前缀来明确告知编译器这是一个类型。例如:
然而,template<typename C> void print2nd(const C& container) { if (container.size() >= 2) { // 这里 C::const_iterator 是嵌套依赖类型名,需用 typename 前缀 typename C::const_iterator iter(container.begin()); ++iter; int value = *iter; std::cout << value; } }typename规则存在一个例外,即它不必前置在基类列表中或成员初始化列表中作为基类标识符的嵌套依赖类型名前。例如:template<typename T> class Derived : public Base<T>::Nested { public: explicit Derived(int x) : Base<T>::Nested(x) { // 在基类列表和成员初始化列表中,typename 不允许 typename Base<T>::Nested temp; // 这里使用嵌套依赖类型名,需用 typename } };
需要注意的是,不同编译器对 typename 规则的执行情况可能不同,这可能会导致一些轻微的可移植性问题。在编写模板代码时,务必遵循上述规则,以确保代码的正确性和可移植性。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
U8W/U8W-Mini使用与常见问题解决
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结