首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

也使用“extern template class”语法时模板类静态成员变量的专门化

"extern template class"语法是C++11引入的一种特性,用于显式实例化模板类的静态成员变量。它的作用是告诉编译器,在其他地方已经有了该模板类的实例化定义,不需要再在当前文件中生成实例化代码。

具体来说,当我们使用模板类时,编译器会根据需要生成相应的实例化代码。而对于静态成员变量,每个实例化的模板类都会有自己的静态成员变量副本,这可能会导致代码冗余和性能问题。

使用"extern template class"语法可以解决这个问题。它的语法形式为:

extern template class ClassName;

其中,ClassName是模板类的名称。通过这种方式,我们告诉编译器,当前文件中不需要生成该模板类的实例化代码,而是在其他地方进行实例化定义。

这种特性的优势在于减少了代码冗余和编译时间,特别是对于大型项目和模板类的使用频率较高的情况下,可以显著提升编译速度和减小可执行文件的大小。

在实际应用中,"extern template class"语法可以用于任何需要显式实例化模板类的场景。例如,当我们在一个头文件中定义了一个模板类,并在多个源文件中使用了该模板类的静态成员变量时,可以在其他源文件中使用"extern template class"语法来避免重复实例化。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,我无法给出具体的推荐。但是,腾讯云作为一家知名的云计算服务提供商,提供了丰富的云计算产品和解决方案,可以根据具体需求进行选择和使用。您可以访问腾讯云官方网站,了解更多关于云计算的信息和产品介绍。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++复习笔记——C++ 关键字

export 为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时...当模板参数使编译器在指认一个类型时产生了误解。 class class(类)是 C++ 面向对象设计的基础。使用class关键字声明一个类。 for for是 C++ 中的循环结构之一。...在 C++ 类的成员变量被声明为static(称为静态成员变量),意味着它被该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员...类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。...namespace namespace(命名空间)用于在逻辑上组织类,是一种比类大的结构。 template template(模板),C++ 中泛型机制的实现。

1.3K30

C++复习篇

一般编译器为自动将未赋值的全局变量进行一次清0 15.静态成员变量/静态成员函数 在类里定义时直接通过static关键字修饰 静态成员变量需要在类外单独分配空间,而静态成员函数则不需要 静态成员变量在程序内部位于静态存储区...对于public公有的静态成员变量/函数时,可以直接通过类名进行直接访问 静态成员函数中不能访问非静态成员变量,因为它属于整个类的,没有隐含this指针 示例如下: class Test{ private...,所以不在类外定义也可以   {     cout<<"mval="<<mval<<endl;   } }; int Test::mval=4; //静态成员变量存在静态存储区中,所以需要在类外定义...能够正确调用某个同名函数是哪个类的对象 比如:当某个子类被强制转换为父类时,则父类的虚函数也会被替代为子类的,从而实现程序灵活性 一个典型的示例,如下所示: class Base //父类 { public...答: 其实编译器对函数模板进行了两次编译 第一次编译时,首先去检查函数模板本身有没有语法错误 第二次编译时,会去找调用函数模板的代码,然后通过代码的真正参数,来生成真正的函数。

1.3K20
  • c++模板与泛型编程

    绑定到指针或引用非类型参数的实参必须具有静态的生存期,即不能用一个非static局部变量或动态对象作为指针或引用非类型模板参数的实参。...因此,与非模板代码将类定义和函数声明放在头文件中而普通函数和类的成员函数的定义放在源文件中不同,模板的头文件通常既包括声明也包括定义。...默认情况下,一个类模板的成员函数只有当程序用到它时才进行实例化。 在类模板自己的作用域中,我们可以直接使用模板名而不提供实参。...在类模板外使用时,类名和返回值类型必须提供模板参数,在函数体内,由于已经进入类的作用域,所以无需重复模板实参,默认与成员实例化所用类型一致。...const int&); template class Blob; // instantiates all members of the class template 一个类模板的实例化定义会实例化该模板的所有成员

    62520

    【笔记】《深入理解C++11》(上)

    初始化列表的效果总是慢于就地初始化, 但也快过在构造函数中进行赋值 注意: 非常量的静态变量依然要在头文件外定义从而保证在程序中只存在一个 sizeof()可以对类成员表达式使用了 类模板也可以声明友元了...原因和extern变量一样, 普通的模板只存在于对应文件的.o中, 如果一个模板文件被多个文件实例化就会产生多份重复代码, 没有extern的话此时重复的模板会冲突....有了extern后编译器会自动删除重复的实例化模板, 不但节省内存还节省了多余的实例化时间 注意被其他文件调用的外部模板一定要在要用到的类实例化之前实例化 局部和匿名成员可以作为模板实参了, 但仍要注意匿名类型的声明不能在参数位置...(为了保证成员摆放的顺序一致) 派生类有非静态成员时, 只有一个仅有静态成员的基类(为了保证基类能被直接折叠, 因为C没有继承关系) 基类有非静态成员时, 派生类没有非静态成员(为了派生类折叠, 因为C..., 需要泛型的时候还是应该用模板处理 auto禁止对结构体中的非静态成员进行推导 不允许声明auto数组 新增的range-for语法要求目标有begin和end函数, 且支持++和==, 常与auto

    2K20

    小朋友学Python(10):CC++JavaPython的关键字

    auto 在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期,若是对象同时具有自动存储类,即生存期在块结束时结束。这样的变量被称为局部变量。...struct在C++中是特殊的类类型,声明中仅默认隐式的成员和基类访问限定与class不同(struct是public,class是private)。 union是联合体类型。...extern, export 为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时...mutable 用于类的非静态非const数据成员,表示不受到成员函数的const的限制,可以在const成员函数中使用。...template 声明模板,实现泛型和参数化编程。 this this是一种实体,仅在类的非静态成员中使用,是指向类的对象的指针。 typedef 用以给数据类型取别名。

    1.4K80

    【C++初阶】C++入门

    9、const、volatile const和volatile是类型修饰符,语法类似,用于变量或函数参数声明,也可以限制非静态成员函数。...struct在C++中是特殊的类类型,声明中仅默认隐式的成员和基类访问限定与class不同(struct是public,class是private)。union是联合体类型。...18、extern 当出现extern “C”时,表示 extern “C”之后的代码按照C语言的规则去编译;当extern修饰变量或函数时,表示其具有外部链接属性,即其既可以在本模块中使用也可以在其他模块中使用...,静态局部变量),也可以修饰函数和类中的成员函数。...29、template 声明一个模板,模板函数,模板类等。模板的特化。 30、this 每个类成员函数都隐含了一个this指针,用来指向类本身。this指针一般可以省略。

    1.3K30

    吃透这些内容,c++ 不再难学

    引用的定义也很简单:引用变量是一个别名,某个已存在变量的另一个名字。...面向模板编程 c++ 的泛型与 java 的泛型有所不同,实现上: java 泛型原理是编译时类型擦除,比如把 T 编译为 Object,然后运行时动态转换类型 c++ 模板原理时编译时特例化,根据模板类...模板类与类里的模板方法的定义互不影响: template // 模板类 class A { public: A() {}; T getValue...endl; 在相同的文件里,多次使用相同的特例化模板时,只会特例化一份代码。...可以使用 extern 关键字声明:不要在这个文件生成特例化代码: extern template declaration; // 模板实例化声明 有时候,我们在使用模板的类型 T 时,想要返回特定的与

    1.4K30

    第 16 章 模板与泛型编程

    第一个阶段是编译模板本身时。这个阶段,编译器可以检查语法错误,如忘记分号或者变量名拼错等。 第二个阶段是编译器遇到模板使用时。对于函数模板调用,会检查实参数目是否正确和参数类型是否匹配。...// 前置声明,在将模板的一个特定实例声明为友元时要用到 template class Pal; class C { // C是一个普通的非模板类 friend class...,实例化 DebugDelete::operator(int *) 类模板也可以定义其成员模板,此时,类和成员各自有自己的、独立的模板参数。...成员模板是函数模板,在类模板外定义一个成员模板时,必须同时为类模板和成员模板提供模板参数列表。...由于编译器在使用一个模板时自动对其实例化,因此 extern声明必须出现在任何使用此实例化版本的代码之前: // Application.cc // 这些模板类型必须在程序其它位置进行实例化 extern

    1.5K20

    第 16 章 模板与泛型编程

    第一个阶段是编译模板本身时。这个阶段,编译器可以检查语法错误,如忘记分号或者变量名拼错等。 第二个阶段是编译器遇到模板使用时。对于函数模板调用,会检查实参数目是否正确和参数类型是否匹配。...// 前置声明,在将模板的一个特定实例声明为友元时要用到 template class Pal; class C { // C是一个普通的非模板类 friend class...,实例化 DebugDelete::operator(int *) 类模板也可以定义其成员模板,此时,类和成员各自有自己的、独立的模板参数。...成员模板是函数模板,在类模板外定义一个成员模板时,必须同时为类模板和成员模板提供模板参数列表。...由于编译器在使用一个模板时自动对其实例化,因此 extern声明必须出现在任何使用此实例化版本的代码之前: // Application.cc // 这些模板类型必须在程序其它位置进行实例化 extern

    1.4K60

    C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记

    1.2 实验知识点 模板编程 基本语法 模板函数 类模板和成员模板 模板类中的静态成员 typename和class 迭代器 迭代器详解 迭代器种类和使用 基本语法 模板编程是 STL 的基石,也是 c...四、类模板和成员模板 类模版 c++11 不仅支持对函数的模板化,也支持对类的模板,下面来看基本的语法是怎样的: template class T> class Myclass { T a; public...成员模板 模板的使用范围是广泛的,不仅可以用作函数模板,类模板,还可以用作 class ,struct ,template class 的成员。而要实现 STL 这是我们必须掌握和使用的特性。...五、模板类中的静态成员 我们知道,在类中定义的静态成员是存储在静态区中,被所有类对象共享,并不属于某一个类所有,同样的在模板类中的静态成员也不会被复制多份,而是被同类实例化的类对象共享,比如所有 int...和所有 double 的类对象,享有相互独立的静态变量。

    60910

    【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )

    static 关键字 1、类模板 static 静态成员 类模板中 , 定义了 static 静态成员变量 ; 静态 成员变量 是属于整个类的 , 但是对于 类模板 来说 , 存在着二次编译 , 会生成多个不同的实际类...静态成员 ; template class Student { public: // 类模板中的静态成员 static T m_a; }; 然后 , 在类外部 , 初始化静态成员..., 之后才能 使用该静态成员 , 使用 静态成员 时 , 要声明 类模板 类型 template , 下面使用 域作用符 访问时 , 需要注明 类模板类型 ; // 初始化静态成员...template T Student::m_a = 0; 最后 , 使用 类模板 中的静态成员时 , 每个 生成的 具体类型 , 都有一个独立互不干扰的 静态成员 ;... class Student { public: // 类模板中的静态成员 static T m_a; }; // 初始化静态成员 template <typename

    26510

    什么?CC++面试过不了?因为你还没看过这个!

    限定的函数或变量是 extern 类型的 被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的 extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作...语法: decltype ( expression ) decltype 使用 // 尾置返回允许我们在参数列表之后声明返回类型 template auto fcn(It beg...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。...虚函数不占用存储空间 虚函数表存储的是虚函数地址 模板类、成员模板、虚函数 模板类中可以使用虚函数 一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数 抽象类、接口类、聚合类...抽象类:含有纯虚函数的类 接口类:仅含有纯虚函数的抽象类 聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。

    3.7K50

    C语言与C++面试知识总结

    限定的函数或变量是 extern 类型的 被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的 extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作...语法: decltype ( expression ) decltype 使用 // 尾置返回允许我们在参数列表之后声明返回类型 template auto fcn(It beg...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。...虚函数不占用存储空间 虚函数表存储的是虚函数地址 模板类、成员模板、虚函数 模板类中可以使用虚函数 一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数 抽象类、接口类、聚合类...抽象类:含有纯虚函数的类 接口类:仅含有纯虚函数的抽象类 聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。

    5K41

    《C++Primer》第十六章 模板与泛型编程

    编译器只能检查语法错误,比如忘记分号或者变量名拼错。 第二个阶段:编译器遇到模板使用时。...只有这个阶段才能发现类型相关的错误,这类错误可能在链接时才报告。 2. 类模板 类模板class template使用来生成类的蓝图的。...当使用一个类模板时,我们必须提供额外信息,即显式模板实参explicit template argument,编译器使用这些模板实参来实例化出特定的类。...,或者限定特定的实例为友元: // 前置声明, 在将模板的一个特定实例声明为友元时将要用到 template class Pal; class C { // C时一个普通的非模板类...比如编译器遇到如下语句时: T::size_type *p // 编译器需要知道我们是正在定义一个名为`p`的变量,还是将一个名为size_type的static数据成员与名为p的变量相乘 如果我们希望使用一个模板类型参数的类型成员

    1.9K10

    《逆袭进大厂》之C++篇49问49答

    ,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不在堆中 根据以上特征,虚函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定,因此最有可能存在全局数据区,测试结果显示:...所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区 静态变量在函数内定义.../details/84060561 综上,总结出使用方法,在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误...)模板函数特例化 必须为原函数模板的每个模板参数都提供实参,且使用关键字template后跟一个空尖括号对,表明将原模板的所有模板参数提供实参,举例如下: template...,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板) 特例化类中的部分成员 可以特例化类中的部分成员函数而不是整个类,举个例子: template class Foo

    2K10

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    ,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不在堆中 根据以上特征,虚函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定,因此最有可能存在全局数据区,测试结果显示:...所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区 静态变量在函数内定义.../details/84060561 综上,总结出使用方法,在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误...)模板函数特例化 必须为原函数模板的每个模板参数都提供实参,且使用关键字template后跟一个空尖括号对,表明将原模板的所有模板参数提供实参,举例如下: template...,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板) 特例化类中的部分成员 可以特例化类中的部分成员函数而不是整个类,举个例子: template class Foo

    2.6K40

    C++名字空间详解

    即用作用域指示符“::”将名字空间的名称和该空间下的标识符连接起来,这要,即使使用同名的标识符,由于它们处于不同的名字空间,也不会发生冲突。 有两种形式的命名空间——有名的和无名的。...(5)不能在名字空间的定义中声明另一个嵌套的子命名空间,只能在命名空间中定义子命名空间。 (6)名字空间的成员,可以在命名空间的内部定义,也可以在名字空间的外部定义,但是要在名字空间进行声明。...命名空间成员的外部定义的格式为: 名字空间名::成员名 …… (7)名字空间在进行分段定义时,不能定义同名的变量,否则连接出现重定义错误。因为名字空间不同于类,具有外部连接的特性。...如果将它们声明为全局静态变量(函数)就可以避免重定义错误。在C++中,除了可以使用static关键字避免全局变量(函数)的重定义错误,还可以通过匿名名字空间的方式实现。参考如下代码。...而类模板的非类型参数要求是编译时常量表达式,或者是指针类型的参数要求指针指向的对象具有外部连接性。

    1.3K10

    lnk2001 lnk1120_lnk1120

    4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。   5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。 静态函数和静态变量具有相同的使用范围限制。...当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。   函数内声明的变量(局部变量) 只能在该函数的范围内使用。   C++ 的全局常量只有静态连接性能。...如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。   ...符号定义为静态,但稍后在文件外部被引用。 没有定义静态类成员。...// LNK2019.cpp // LNK2019 expected templateclass T> void f(T) { } templateclass T> struct

    1.1K20

    学习PCL库你应该知道的C++特性

    要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。 类之间不可循环调用:在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可。...不可使用静态成员:静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。...方式一由语言支持所以移植性好,方式二 可以避免名字冲突 C++模块类 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数申明一种一般的模式,使得类中的某些数据成员或者成员函数的参数,返回值取得任意类型...模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板。 函数模板针对仅参数类型不同的函数,类模板针对仅数据成员和成员函数类型不同的类。...template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。

    1.2K20

    PCL库中的C++特性

    要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。 类之间不可循环调用:在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可。...不可使用静态成员:静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。...方式一由语言支持所以移植性好,方式二 可以避免名字冲突 C++模块类 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数申明一种一般的模式,使得类中的某些数据成员或者成员函数的参数,返回值取得任意类型...模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板。 函数模板针对仅参数类型不同的函数,类模板针对仅数据成员和成员函数类型不同的类。...template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。

    1.1K30
    领券