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

VS2015头文件失败,并返回错误C2864:“具有类内初始值设定项的静态数据成员...”

问题描述:

在使用VS2015编译代码时,遇到了头文件失败的问题,并返回错误C2864:“具有类内初始值设定项的静态数据成员...”

解决方案:

错误C2864是由于在类内部定义了具有类内初始值设定项的静态数据成员导致的。在VS2015中,这种语法是不被支持的。

要解决这个问题,可以采取以下几个步骤:

  1. 检查代码中的静态数据成员定义,确保没有使用类内初始值设定项的语法。类内初始值设定项是指在类内部直接对静态数据成员进行赋值,例如:class MyClass { static int myStaticVar = 0; // 这种语法是错误的 };正确的做法是将静态数据成员的定义放在类外部,并在类外部进行初始化:class MyClass { static int myStaticVar; }; int MyClass::myStaticVar = 0; // 在类外部进行初始化
  2. 如果代码中存在多个源文件,确保静态数据成员的定义只出现在一个源文件中。在其他源文件中,使用extern关键字声明该静态数据成员即可:// MyClass.h class MyClass { static int myStaticVar; };

// MyClass.cpp

int MyClass::myStaticVar = 0; // 只在一个源文件中进行定义和初始化

// OtherFile.cpp

extern int MyClass::myStaticVar; // 在其他源文件中使用extern声明

代码语言:txt
复制
  1. 如果以上步骤都没有解决问题,可以尝试更新Visual Studio到最新版本,或者尝试使用其他编译器进行编译。

总结:

在VS2015中,错误C2864:“具有类内初始值设定项的静态数据成员...”是由于使用了类内初始值设定项的语法导致的。解决方法是将静态数据成员的定义放在类外部,并在类外部进行初始化。如果存在多个源文件,需要注意只在一个源文件中进行定义和初始化,并在其他源文件中使用extern声明。如果问题仍然存在,可以尝试更新Visual Studio或使用其他编译器。

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

相关·内容

C++编译与链接(0)-.h与.cpp中的定义与声明

static函数 在不同的cpp中可以定义函数原型一样的函数 类 不同的cpp中类的名字可以一样 类成员与函数 在.h中定义,所有成员必须在类中声明,在cpp中实现 非静态的常量整形数据成员不能就地初始化...C2864: “A::i”: 只有静态常量整型数据成员才可以在类中初始化    d:\我的资料库\documents\visual studio 2010\projects\fasd\fasd\1.h...需要到头文件以外去定义它) 类的静态的常量整形数据成员 可以就地初始化 如 class A { private: const static int i = 5; }; 模板(不考虑export)...,而不可以在构造函数函数体内初始化 2、同类数据成员中的特殊说明 类的静态的数据成员 ------------------- 不可以 不可以就地初始化,需要到.cpp中进行定义 (对于非常量的静态成员变量...需要到头文件以外去定义它) 类的静态的常量整形数据成员 ------------------ 可以 特殊说明 模板 模板函数与模板类的声明与实现必须放在一个文件中 至于为什么会这样,与C++的编译和链接

3.7K70

C#6.0 新增功能

此功能实现用于创建不可变类型的真正语言支持且使用更简洁和方便的自动属性语法。 02 自动属性初始化表达式 自动属性初始值设定项可让你在属性声明中声明自动属性的初始值。...指定要使用的类: using static System.Math; Math 不包含任何实例方法。 还可以使用 using static 为具有静态和实例方法的类导入类的静态方法。...鉴于此行为,建议仔细编写 catch 和 finally 子句,避免引入新的异常。 10 使用索引器初始化关联集合 索引初始值设定项是提高集合初始值设定项与索引用途一致性的两个功能之一。...11 集合初始值设定项中的扩展 Add 方法 使集合初始化更容易的另一个功能是对 Add 方法使用扩展方法。 添加此功能的目的是进行 Visual Basic 的奇偶校验。...如果自定义集合类的方法具有通过语义方式添加新项的名称,则此功能非常有用。 12 改进了重载解析 在以前的一些构造中,以前版本的 C# 编译器可能会发现涉及 lambda 表达式的一些方法不明确。

1.7K20
  • 第7章 类

    合成的默认构造函数可能执行错误的操作。当默认初始化类的内置类型的数据成员时,如果在类内没有初始值,则执行默认初始化后这些成员变量的值是未定义的。...并且 static关键字只能出现在类内声明语句中。 非字面值常量类型的静态数据成员必须在类外进行初始化。 能进行类内初始化的静态数据成员必须是字面值常量,包括算术类型、引用、指针等。...即使进行了类内的静态常量初始化,也最好在类外定义一下该变量,只是不能再次指定初始值。 静态数据成员可以是不完全类型。...即,静态数据成员的类型可以就是它所属的类类型,而非静态数据成员只能是所属类的引用或指针。...Bar mem3; // 错误,数据成员必须完全类型 }; 静态成员可以作为默认实参,而非静态成员则不可以。

    85040

    Google C++ 编程风格指南(二):作用域

    // 使用本名字空间内的符号 EOF } // namespace 然而, 与特定类关联的文件作用域声明在该类中被声明为类型, 静态数据成员或静态成员函数, 而不是匿名名字空间的成员....缺点: 将非成员函数和静态成员函数作为新类的成员或许更有意义, 当它们需要访问外部资源或具有重要的依赖关系时更是如此. 结论: 有时, 把函数的定义同类的实例脱钩是有益的, 甚至是必要的....这样的函数可以被定义成静态成员, 或是非成员函数. 非成员函数不应依赖于外部变量, 应尽量置于某个名字空间内. 相比单纯为了封装若干不共享任何静态数据的静态成员函数而创建类, 不如使用 2.1....静态生存周期的对象,即包括了全局变量,静态变量,静态类成员变量和函数静态变量,都必须是原生数据类型 (POD : Plain Old Data): 即 int, char 和 float, 以及 POD...比如,在程序结束时某静态变量已经被析构了,但代码还在跑——比如其它线程——并试图访问它且失败;再比如,一个静态 string 变量也许会在一个引用了前者的其它变量析构之前被析构掉。

    79030

    C#7.3 新增功能

    01 启用更高效的安全代码 你应能够安全地编写性能与不安全代码一样好的 C# 代码。 安全代码可避免错误类,例如缓冲区溢出、杂散指针和其他内存访问错误。 这些新功能扩展了可验证安全代码的功能。...1.3 stackalloc 数组支持初始值设定项 当你对数组中的元素的值进行初始值设定时,你已能够指定该值: var arr = new int[3] {1, 2, 3}; var arr2 = new...2.4 扩展初始值设定项中的表达式变量 已对在 C# 7.0 中添加的允许 out 变量声明的语法进行了扩展,以包含字段初始值设定项、属性初始值设定项、构造函数初始值设定项和查询子句。...如果方法在含有实例接收器的情况下被调用,则编译器将丢弃静态成员。 在没有接收器时,编译器将仅添加静态上下文中的静态成员,否则,将同时添加静态成员和实例成员。...静态上下文(其中隐式 this 实例接收器无法使用)包含未定义 this 的成员的正文(例如,静态成员),以及不能使用 this 的位置(例如,字段初始值设定项和构造函数初始值设定项)。

    1.7K10

    《C++Primer》第七章 类

    无论何时只要类的对象被创建,就会执行构造函数。 默认构造函数:如果存在类内的初始值,则用它初始化成员;不存在的话执行默认初始化。...这里inline成员函数基于相同的原因也应该和相应的类定义在头一个头文件中。 3....,并且具有特殊的初始化语法形式,它满足: 所有成员都是public的 没有定义任何构造函数 没有类内初始值 没有基类,也没有virtual函数 类的静态成员 有时候类需要它的一些成员与类本身直接相关而不是与类的各个对象保持关联...静态成员的类内初始化 通常情况下,类的静态成员不应该在类的内部初始化,但是我们可以为静态成员提供const整数类型的类内初始值,不过要求静态成员必须是字面值常量类型的constexpr,初始值必须是常量表达式...静态数据成员可以是不完全类型,非静态数据成员只能声明它所属类的引用或者指针 我们可以使用静态成员作为默认实参 class Screen { public: // bkground表示一个在类中稍后定义的静态成员

    56820

    第 19 章 特殊工具与技术

    第二步,编译器运行相应的构造函数,以构造这些对象,并为其传入初始值。 第三步,对象被分配的空间并构造完成,返回一个指向该对象的指针。...*pdata; s = pScreen->*pdata; 因为数据成员一般情况下是私有的,不能直接获得数据成员的指针。可以在类的内部定义一个成员函数,另其返回值是指向该成员的指针。...嵌套类的名字在外层类作用域中是可见的,在外层内作用域之外的可见性由其访问权限修饰符决定。嵌套类可以直接使用外层内的成员,无需对该成员的名字进行限定。...与其他内置类型一样,默认情况下 union是未初始化的,可以使用一对花括号内的初始值显式地初始化一个 union。如果提供了初始值,则该初始值被用于初始化第一个成员。...在局部类中也不允许声明静态数据成员,因为没法定义这样的成员。 外层函数对局部类的私有成员没有任何访问特权。 局部类只能访问外层作用域定义的类型名、静态变量以及枚举成员。

    75140

    第 19 章 特殊工具与技术

    第二步,编译器运行相应的构造函数,以构造这些对象,并为其传入初始值。 第三步,对象被分配的空间并构造完成,返回一个指向该对象的指针。...*pdata; s = pScreen->*pdata; 因为数据成员一般情况下是私有的,不能直接获得数据成员的指针。可以在类的内部定义一个成员函数,另其返回值是指向该成员的指针。...嵌套类的名字在外层类作用域中是可见的,在外层内作用域之外的可见性由其访问权限修饰符决定。嵌套类可以直接使用外层内的成员,无需对该成员的名字进行限定。...与其他内置类型一样,默认情况下 union是未初始化的,可以使用一对花括号内的初始值显式地初始化一个 union。如果提供了初始值,则该初始值被用于初始化第一个成员。...在局部类中也不允许声明静态数据成员,因为没法定义这样的成员。 外层函数对局部类的私有成员没有任何访问特权。 局部类只能访问外层作用域定义的类型名、静态变量以及枚举成员。

    83750

    C#构造函数的作用_以下程序段的作用是inta

    构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化 (1)构造函数的名字必须与类同名; (2)构造函数没有返回类型,它可以带参数,也可以不带参数; (3)构造函数的主要作用是完成对类的初始化工作...; (4)在创建一个类的新对象(使用new关键字)时,系统会自动调用给类的构造函数初始化新对象; C#的类有两种构造函数:实例构造函数和静态构造函数 实例构造函数:负责初始化类中的实例变量,...类的静态构造函数在给定应用程序域中至多执行一次,只有创建类的实例或者引用类的任何静态成员才激发,不能带又参数; (4)静态构造函数是不可继承的,而且不能被直接调用;       (5)...如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行.任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项; ...(6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数; 一个类可以同时拥有实例构造函数和静态构造函数,这是惟一可以具有相同参数列表的同名方法共存的情况

    66710

    《C++Primer》第十九章

    ,并为其传入初始值 第三步:对象被分配了空间并构造完成,返回一个指向该对象的指针 delete sp; // 销毁*sp, 然后释放sp指向的内存空间 delete [] arr; //...使用RTTI 在某些情况下RTTI非常有用,比如我们想为具有继承关系的类实现相等运算符时。对于两个对象来说,如果他们的类型相同并且对应的数据成员取值相同,则我们说这两个类是相等的。...使用union类型 和其他内置类型一样,默认情况下union是未初始化的,我们可以像显式地初始化聚合类一样用一对花括号内的初始值显式地初始化一个union: Token first_token = {'...局部类的成员必须完整定义在类的内部,所以成员函数的复杂性不能太高,一般只有几行代码 在局部类中不允许声明静态数据成员 1....位域 类可以将其(非静态)数据成员定义成位域bit-field,在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或者硬件设备传递二进制数据时,通常会用到位域。

    1.4K10

    申明与定义的区别

    c或者.cpp文件); (3)类型的定义应该放在头文件,因为类型不具有外部连接性,不同源文件拥有相同的类型定义不会报编译错误,但头文件不能重复包含。...typedef int int32; 注意,类型的作用域是源文件,即类型不具有外部连接性质,因此可以在不同源文件定义相同名称的类型,比如定义同名的类是不会报重定义错误的,这也说明了类型的定义应该放在头文件中...的所有成员的有效范围均是从定义类的地方开始,故使用未知的构造函数初始化其成员变量是错误的,会报使用未定义的 class “A”错误。...虽然说是定义类型,但还是将类型的定义放在头文件,即使被不同的源文件包含,因为类型不具有外部连接特性,所以不会报重定义错误的,这和变量和函数不同,不能将变量和函数的定义放在头文件!切记!...这里所说的外部连接与内部连接的区别在于链接器接的时候是否将当前目标文件中的定义与其它目标文件对比,并报告是否有重定义错误。内连接不会进行对比,故不同源文件中定义相同名称的类型是不会报错的。

    1.6K20

    【笔记】《C++Primer》—— 第7章:类

    7.1 定义抽象数据类型 封装的目的是使得接口与实现之间的分离,隐藏实现细节使用户无需理解细节就能使用 类在C++中既可以用struct也可以用class,其区别在于默认的访问权限 类的成员函数必须声明在类内...成员函数若以引用形式返回*this,则此时返回的是常量引用 尽量避免在多处使用相同的代码,所以尽量把类似的功能写为函数并迭代组合使用 类可以声明而暂时不定义,此时成为前向声明,得到的类是不完全类型,可以作为参数...数据成员都是字面值常量的聚合类或不是聚合类但其成员都是字面值,至少含有一个constexpr构造函数,成员若有类内初始值则必由字面值常量或其自己的constexpr构造且类必须使用默认的析构函数的类,称为字面值常量类...它的实参必须由字面值,初始值或constexpr来初始化 7.6 类的静态成员 通过在类的成员前加static来使其成为类的静态成员,与类本身联系在一起,类似于全局范围里的静态变量 类的静态成员存在于所有对象之外...const属性的初始值或用constexpr来初始化 要注意由于静态变量不是由构造函数初始化的,一般来说我们不能在类内初始化它,而是在类内声明它然后在类外定义并初始化它 由于类内的它的初始化只是声明而已

    61420

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

    ,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。 this 指针 this 指针是一个隐含于每一个非静态成员函数中的特殊指针。...// 恢复对齐状态 位域 Bit mode: 2; // mode 占 2 位 类可以将其(非静态)数据成员定义为位域(bit-field),在一个位域中含有一定数量的二进制位。...抽象类:含有纯虚函数的类 接口类:仅含有纯虚函数的抽象类 聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。...(因为子类可能有不在父类的字段或方法) dynamic_cast 用于多态类型的转换 执行行运行时类型检查 只适用于指针或引用 对不明确的指针的转换将失败(返回 nullptr),但不引发异常 可以在整个类层次结构中移动指针

    5K41

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

    ,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。 this 指针 this 指针是一个隐含于每一个非静态成员函数中的特殊指针。...// 恢复对齐状态 位域 Bit mode: 2; // mode 占 2 位 类可以将其(非静态)数据成员定义为位域(bit-field),在一个位域中含有一定数量的二进制位。...抽象类:含有纯虚函数的类 接口类:仅含有纯虚函数的抽象类 聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。...(因为子类可能有不在父类的字段或方法) dynamic_cast 用于多态类型的转换 执行行运行时类型检查 只适用于指针或引用 对不明确的指针的转换将失败(返回 nullptr),但不引发异常 可以在整个类层次结构中移动指针

    3.7K50

    C#基础知识系列五(构造函数)

    实例构造函数 使用 new 表达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量。 要初始化静态类或非静态类中的静态变量,必须定义静态构造函数。...例如,可以向 CoOrds 类添加构造函数,以便可以为数据成员指定初始值: public CoOrds(int x, int y) { this.x = x; this.y = y; }...类构造函数可通过初始值设定项来调用基类的构造函数,如下所示: abstract class Shape { public const double pi = Math.PI; protected...私有构造函数 私有构造函数是一种特殊的实例构造函数。 它通常用在只包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。...静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。

    92430

    C++类的静态数据成员和静态成员函数

    公有属性 一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况...静态数据成员 类的静态数据成员是属于这个类的,而不是属于某个对象的。...在类定义的时候非静态数据成员是不分配内存的,只有在创建类对象的时候才分配内存,但静态数据成员是要分配内存的,因为它是属于类的,只有一块内存,所以要初始化它,而且不能在类的声明中初始化,必须要在类外初始化...如果你不初始化静态数据成员,系统会报编译错误。...静态数据成员的访问受类的访问权限控制。如果定义为私有,则可以在类内访问到。

    19230

    复合类型以及函数总结

    new 定义变量:int *p=new 动态对象的类型(其中动态对象的初始值);删除时:delete 指针;定义数组:int *p=new int[100];删除:delete [] 指针;定义指针:需要调用头文件删除之后的指针不可以在进行使用...也可以通过迭代器来访问数组中的每一个元素。头文件是,有两个关键词,begin(),end(),括号内是数组名。...字符串 Char类型的字符串在头文件有几个函数, strlen()返回字符串的长度。Strcmp(p1,p2)判断p1,p2的关系,若等于则返回0,大于则返回正值,小于则返回负值。...Strcat(p1,p2)将后者附加到前者后面,并返回前者的值。 Strcpy(p1,p2)将后者复制到前者后面,并返回前者的值。 String:头文件。...: 函数返回值类型 函数名(行参类型 形参名) { 函数内的内容 } void类型的函数无返回值。

    15610

    MFC 调用静态链接 MFC 的规则 DLL

    简语: 最近学习了生成静态链接的dll及其调用,写一下笔录和大家分享,有错误的地方欢迎大家指出来 开发环境 VS2015 开发语言 C++ 开发步骤 以mfc的dll创建为例,先说明一下win32的dll...构建MFC的DLL项目 新建MFC DLL项目 ? 这边选择带静态链接MFC的规则DLL ? 默认生成了,头文件和源文件,右键def文件 ?...然后再配置库名称,项目属性->链接器-->输入,配置附加依赖项,即把要添加的lib,名称加进去 ? 到此依赖的静态链接库都配置好了。...void OnBnClickedButton1(); CMyDLLApp MyDllApp; afx_msg void OnBnClickedButton2(); //因为静态的方法无法使用非静态的成员...// IDM_ABOUTBOX 必须在系统命令范围内。

    2.5K20

    深入理解Android系统资源异常之文件描述符异常篇

    文件; fdsan.h,是fdsan方案的公共头文件,包含了API接口原型声明以及tag类型的枚举定义; bionic_fdsan.h,是fdsan方案内部私有头文件,定义了进程内部存储fd关联tag信息的数据结构...; overflow,动态数组,当进程打开文件数量超出静态数组阈值时候,动态分配; at,成员函数,用于根据fd做索引,返回对应的tag值; 模板特化类型FdTable定义,指定静态数组大小为128。...错误处理相关代码足够清晰,就不用赘述了。 如果ownership匹配,但是调用__close返回失败,再进行判断,是否发生了double close。...(2) fdtrack内部实现数据结构定义 首先介绍的是android_fdtrack_event结构体,封装了发送到fd_hook的数据包 其中有重要的成员type,用来在fd_hook中区分是create...,对其中每一项有效调用栈记录backtrace,提取出函数name与函数内offset信息,然后调用callback接口进行计算处理。

    2.8K10
    领券