Почему нельзя определить переменную-член stati c внутри main ()? - PullRequest
0 голосов
/ 24 апреля 2020
class test 
{
public:
  static int i;

  int func() {
    return i;
  }
};

int main() 
{ 
  test::i = 20;
}

не компилируется с clang: error: linker command failed with exit code 1 (use -v to see invocation).

Если я задаю переменную stati c inline, я могу определить ее внутри main. Или, если я не сделаю это встроенным, я могу определить его между объявлением класса и main() следующим образом:

class test 
{
public:
  static int i;

  int func() {
    return i;
  }
};

int test::i = 20;

int main() 
{ 

}

Почему это работает, а первое - нет? Кроме того, зачем здесь нужен int, когда он уже объявлен как int внутри test?

1 Ответ

2 голосов
/ 24 апреля 2020

Внутри функции оператор

test::i = 20;

является выражением (не определением). Он сохраняет значение 20 в test::i. Но если test::i никогда не был определен, вы не можете сохранить в нем значение.

С другой стороны, в области имен, когда вы пишете

int test::i = 20;

, это определение test::i.

...