您现在的位置是:首页 >学无止境 >Effective C++读书笔记——item42(typename的两个含义)网站首页学无止境

Effective C++读书笔记——item42(typename的两个含义)

使大国和共民人华中 2026-05-07 00:01:04
简介Effective C++读书笔记——item42(typename的两个含义)
  1. 声明模板类型参数:在声明模板类型参数时,classtypename 含义完全相同,可以互换使用。
    template<class T> class Widget1; // 使用 "class"
    template<typename T> class Widget2; // 使用 "typename"
    
  2. 标识嵌套依赖类型名:在模板中,当涉及到嵌套依赖类型名时,必须使用 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 规则的执行情况可能不同,这可能会导致一些轻微的可移植性问题。在编写模板代码时,务必遵循上述规则,以确保代码的正确性和可移植性。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。