我正在阅读关于gtest的介绍并发现这部分令人困惑:
编译器抱怨某些静态const成员变量的"未定义引用",但我确实在类体中定义了它们.怎么了?
如果您的类具有静态数据成员:
Run Code Online (Sandbox Code Playgroud)// foo.h class Foo { ... static const int kBar = 100; };您还需要在foo.cc中的类主体之外定义它:
Run Code Online (Sandbox Code Playgroud)const int Foo::kBar; // No initializer here.否则你的代码是无效的C++,并可能以意想不到的方式中断.特别是,在Google Test中使用它比较断言(EXPECT_EQ等)将生成"未定义的引用"链接器错误.
有人可以解释为什么在类中定义静态const而不在类体外定义它是非法的C++?
首先,在一个类体内不是一个定义,它是一个声明.声明指定常量的类型和值,该定义保留存储空间.您可能不需要存储空间,例如,如果您仅将该值用作编译时常量.在这种情况下,您的代码是完全合法的C++.但是如果你做的事情就像通过引用传递常量,或者使指针指向常量,那么你也需要存储.在这些情况下,您将收到"未定义的引用"错误.