首页
学习
活动
专区
工具
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.6K70

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; // 错误数据成员必须完全类型 }; 静态成员可以作为默认实参,而非静态成员则不可以。

    84540

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

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

    77630

    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.6K10

    《C++Primer》第七章

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

    56520

    第 19 章 特殊工具与技术

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

    74740

    第 19 章 特殊工具与技术

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

    82950

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

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

    66410

    《C++Primer》第十九章

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

    1.3K10

    申明与定义区别

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

    1.5K20

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

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

    61020

    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...私有构造函数 私有构造函数是一种特殊实例构造函数。 它通常用在只包含静态成员中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则其他(除嵌套外)无法创建该类实例。...静态构造函数典型用途是:当使用日志文件时,将使用这种构造函数向日志文件中写入

    91930

    C++静态数据成员静态成员函数

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

    18730

    复合类型以及函数总结

    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类型函数无返回值。

    15510

    总结c++ primer中notes

    初窥输入/输出 endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行效果,刷新与设备相关联缓冲区。通过刷新缓冲区,用户可立即看到写入到流中输出。...在本来可以运行程序 中寻找这类问题是一非常不愉快任务。 关键概念:强静态类型 C++ 是一门静态类型语言,在编译时会作类型检查。...初始化指创建变量给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。记住:当初始化类型对象时,直接初始化语法更灵活且效率更高。对内置类型来说,复制初始化和直接初始化几乎没有差别。...简化复杂类型定义,使其更易理解。 允许一种类型用于多个目的,同时使得每次使用该类型目的明确。 枚举成员是常量 可以为一个或多个枚举成员提供初始值,用来初始化枚举成员值必须是一个常量表达式。...接口由使用该类代码需要执行操作组成。实现一般包括该类所需要数据。实现还包括定义该类需要但又不供一般性使用函数。 编程新手经常会忘记定义后面的分号,这是个很普遍错误

    1.6K90

    深入理解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.6K10
    领券