C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了VC警告C4356:无法通过派生类初始化静态数据成员大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码发出此警告,但似乎工作正常,因为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”因为它是静态的.

大佬总结

以上是大佬教程为你收集整理的VC警告C4356:无法通过派生类初始化静态数据成员全部内容,希望文章能够帮你解决VC警告C4356:无法通过派生类初始化静态数据成员所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: