函数内部不允许定义或重新声明

时间:2015-11-12 22:14:34

标签: c++ static-members

Something.h

  1 class Something
  2 {
  3 private:
  4     static int s_nIDGenerator;
  5     int m_nID;
  6     static const double fudgeFactor;    // declaration - initializing here will be warning
  7 public:
  8     Something() { m_nID = s_nIDGenerator++; }
  9 
 10     int GetID() const { return m_nID; }
 11 };

Foo.cpp中

  1 #include <iostream>
  2 #include "Something.h"
  3 
  4 // This works!
  5 //const double Something::fudgeFactor = 1.57;
  6 
  7 int main()
  8 {
  9     Something cFirst;
 10     Something cSecond;
 11     Something cThird;
 12 
 13     const double Something::fudgeFactor = 3.14;
 14 
 15     using namespace std;
 16     cout << cFirst.GetID() << endl;
 17     cout << cSecond.GetID() << endl;
 18     cout << cThird.GetID() << endl;
 19     return 0;
 20 }

当尝试在main中定义Class Something的静态成员变量的值时,我会遇到编译器错误,如下所示。在main()之外分配一个值可以正常工作。我知道静态成员变量只能赋值一次,但为什么将它分配给函数而不是函数内部呢?

$ clang++ foo.cpp foo.cpp:13:29: error: definition or redeclaration of 'fudgeFactor' not allowed inside a function const double Something::fudgeFactor = 3.14; ~~~~~~~~~~~^ 1 error generated.

2 个答案:

答案 0 :(得分:2)

你不是在函数内部分配变量;你是定义(并初始化它)。由于范围规则,您无法在函数内部执行此操作。变量在全局(命名空间)范围内声明;因此,它也必须在命名空间范围内定义。它不是局部变量。

顺便说一下,对于静态const变量,最近的C ++标准允许你在声明时初始化它们(如在你的.h文件中),但你仍然需要定义它们,但这次没有初始化器:

const double Something::fudgeFactor;

答案 1 :(得分:0)

类的静态数据成员需要具有外部链接。通过此规则,必须在命名空间范围内定义静态成员。