枚举类型的 C++ 静态成员变量无法编译

标签 c++ static enums

我正在尝试编写一个具有公共(public)枚举和该枚举类型的私有(private)静态成员变量的类。我可以初始化静态变量的值,但如果我尝试在类成员函数中访问它,我的代码将无法链接。这是一个简单的工作示例,可以使用以下命令进行编译:

g++ -o TestClass.o TestClass.cpp 

但是当我尝试使用以下命令编译/链接主源文件时失败:

g++ -o test TestClass.o testmain.cpp 

我得到的错误是:

Undefined symbols for architecture x86_64:
  "TestClass::_enum", referenced from:
      TestClass::printEnum()     in TestClass.o
ld: symbol(s) not found for architecture x86_64

我使用的是运行 OSX 10.7.5 和 gcc 4.2.1 的 Mac。

TestClass.h:

#ifndef TEST_CLASS_H
#define TEST_CLASS_H

class TestClass
{
public:
  TestClass() {};  
  void printEnum();

  typedef enum {A, B, C} MyEnum;

private:
  static MyEnum _enum;


};

#endif

TestClass.cpp:

#include "TestClass.h"

#include <iostream>
using namespace std;

TestClass::MyEnum _enum = TestClass::A;

void TestClass::printEnum()
{
  cout << "Value of enum: " << _enum << endl;
}

testmain.cpp:

#include "TestClass.h"

int main()
{
  TestClass tc;

  tc.printEnum();
}

最佳答案

下面的代码声明了一个 TestClass::MyEnum 类型的文件局部变量 _enum。它没有提供静态成员变量的定义。

TestClass::MyEnum _enum = TestClass::A;

为此,您必须在适当的类范围内专门定义它,如下所示:

TestClass::MyEnum TestClass::_enum = TestClass::A;

关于枚举类型的 C++ 静态成员变量无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15892827/

相关文章:

PHP 静态二进制构建

c++ - 无法访问 const static std::map 枚举结构

go - 如何在Golang中检查值是否为iota常量类型?

c++ - C++中静态对象的销毁顺序

c++ - 使用 mingw 在每个新库或可执行文件中重新初始化本地静态对象

c++ - 如何在 C++ 中正确验证整数?

c++ - 通过其成员的地址激活嵌套 union 是否合法?

c# - 具有 int 值的枚举?

c++ - 为什么范围解析运算符在类外给出错误?

c++ - OpenGL:Glut.h 访问冲突