2015-11-12 2 views
2

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() отлично работает. Я понимаю, что статические переменные-члены могут быть заданы только один раз, но почему назначение его вне функции по сравнению с функцией функции?

$ 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

Вы не назначения переменной внутри функции; вы определяете его (и инициализируете его). Вы не можете сделать это внутри функции из-за правил области. Переменная объявлена ​​ в глобальной области (пространстве имен); поэтому он также должен быть определен в области пространства имен. Это не локальная переменная.

К слову, для статических константных переменных последние C++-стандарты позволяют инициализировать их в точке объявления (как в вашем .h-файле), но вы все равно должны их определить, но на этот раз без инициализатора:

const double Something::fudgeFactor; 
+1

Вы можете использовать 'constexpr' вместо' const' – Slava

+0

Да, вы правы. На самом деле, я думаю об удалении этого ответа, потому что ваш комментарий совершенно справедливо указывает на то, что вопрос является дубликатом, и мы не хотим загрязнять SO дубликатами. –

0

Статические элементы данных класса должны иметь внешнюю связь. По этому правилу статические члены должны быть определены в области пространства имен.

Смежные вопросы