VC警告C4356:无法通过派生类初始化静态数据成员
发布时间:2020-12-16 07:16:11 所属栏目:百科 来源:网络整理
导读:以下代码发出此警告,但似乎工作正常,因为A :: st和B :: st都被初始化并且实际上代表相同的字符串.根据我的理解,这是错误的代码,它不应该编译(我检查了clang).我想知道为什么VC不会发出错误而不是警告? #include string#include iostreamclass A{public: sta
以下代码发出此警告,但似乎工作正常,因为A :: st和B :: st都被初始化并且实际上代表相同的字符串.根据我的理解,这是错误的代码,它不应该编译(我检查了clang).我想知道为什么VC不会发出错误而不是警告?
#include <string> #include <iostream> class A { public: static const std::string st; }; class B : public A { }; const std::string B::st = "abcd"; //warning C4356: 'A::st': static data member cannot be initialized via derived class int main() { std::cout << A::st << std::endl; // outputs "abcd" std::cout << B::st << std::endl; // outputs "abcd" } 解决方法
从继承定义一切都很好
因为B是A加上一些额外的东西,但想想你已经定义了什么! 您在类a中定义了一个静态const字符串. 因为它是静态的,所以它是全局的,并且对于A和B的所有实例都是相同的. 因为即使A的直接实例也会用“abcd”初始化 如果你有一个也来自A而不是来自B的D它将包含abcd 并且因为它是静态的,你无法定义包含“abcd”的B和包含“efgh”的D 我没试过,但我很确定你会遇到麻烦 如果你定义 clase D :public A { }; const std:string d:st = "efgh"; 即使编译器只告诉警告它可能依赖于链接顺序A :: st的内容.它可能是“abcd”或“efgh”但是d :: st将是“abcd”或B :: st将是“efgh”你不能为B定义“abcd”而为D定义“efgh”因为它是静态的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |