Информация об изменениях

Сообщение Re[5]: Ошибка, если конструктор определен в h-файле (этюд?) от 05.07.2023 14:16

Изменено 05.07.2023 14:18 vsb

Re[5]: Ошибка, если конструктор определен в h-файле (этюд?)
Хотя у меня не получилось повторить ситуацию, в которой, как я думал, компилятор будет ругаться. Поэтому прошу знатоков прокомментировать.

template <typename T>
class MyPtr {
  T *ptr;

  public: 
  MyPtr() {
    ptr = new T();
  }
};

class Class2;

class Class1 {
  MyPtr<Class2> c2ptr;

  Class1() {}
};

class Class2 { };


Я ожидал, что на строчке Class1(), где вызывается конструктор MyPtr, в свою очередь вызывающий конструктор Class2() программа не скомпилируется, т.к. на момент компиляции этой строки компилятор ещё не увидел полное объявление Class2 и не знает, есть ли у него публичный конструктор.

Однако же: компилируется. При этом если добавить классу Class2 приватный конструктор, то не компилируется, причём со ссылкой вперёд.

Извиняюсь за дезинформацию, моё понимание С++ в данном случае подвело и я не знаю, почему так происходит.
Re[5]: Ошибка, если конструктор определен в h-файле (этюд?)
Хотя у меня не получилось повторить ситуацию, в которой, как я думал, компилятор будет ругаться. Поэтому прошу знатоков прокомментировать.

template <typename T>
class MyPtr {
  T *ptr;

  public: 
  MyPtr() {
    ptr = new T();
  }
};

class Class2;

class Class1 {
  MyPtr<Class2> c2ptr;

  Class1() {}
};

class Class2 { };


Я ожидал, что на строчке Class1(), где вызывается конструктор MyPtr, в свою очередь вызывающий конструктор Class2() программа не скомпилируется, т.к. на момент компиляции этой строки компилятор ещё не увидел полное объявление Class2 и не знает, есть ли у него публичный конструктор.

Однако же: компилируется. При этом если добавить классу Class2 приватный конструктор, то не компилируется, причём ошибка ссылается вперёд, туда, куда вроде как компилятор ещё не успел дойти.

Извиняюсь за дезинформацию, моё понимание С++ в данном случае подвело и я не знаю, почему так происходит.