Re[24]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 09:41
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Потому что Shmj говорил, что изначально у Class1 вообще явно определенного конструктора не было, был только дефолтный, сгенерированный самим компилятором.


Для рассматриваемого случая принципиальной разницы нет — что дефолтный конструктор, определенный компилятором, что дефолтный конструктор, определенный пользователем в теле класса, — оба варианта приводят к одной и той же ошибке.
--
Справедливость выше закона. А человечность выше справедливости.
Re[20]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 09:44
Оценка: :))
Здравствуйте, Shmj, Вы писали:

S>Пока даю шанс России.


Цирк уехал, а Shmj остался.
--
Справедливость выше закона. А человечность выше справедливости.
Re[25]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 09:47
Оценка: +1
Здравствуйте, rg45, Вы писали:

S>>Потому что Shmj говорил, что изначально у Class1 вообще явно определенного конструктора не было, был только дефолтный, сгенерированный самим компилятором.


R>Для рассматриваемого случая принципиальной разницы нет — что дефолтный конструктор, определенный компилятором, что дефолтный конструктор, определенный пользователем в теле класса, — оба варианта приводят к одной и той же ошибке.


Это да. Просто хотелось понять, как Shmj умудрялся работать с экземплярами Class1, если в Class1 не было явно описанного пользователем конструктора.
Re[21]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 09:47
Оценка:
Здравствуйте, rg45, Вы писали:

R>Цирк уехал, а Shmj остался.


А он разве остался?
Re[26]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 09:49
Оценка:
Здравствуйте, so5team, Вы писали:

S>Это да. Просто хотелось понять, как Shmj умудрялся работать с экземплярами Class1, если в Class1 не было явно описанного пользователем конструктора.


Ну так, возможно, до него все работало и с автоматически сгенерированным конструктором. Не зря же он подключился к проекту
--
Справедливость выше закона. А человечность выше справедливости.
Re[27]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 09:54
Оценка: +1
Здравствуйте, rg45, Вы писали:

S>>Это да. Просто хотелось понять, как Shmj умудрялся работать с экземплярами Class1, если в Class1 не было явно описанного пользователем конструктора.


R>Ну так, возможно, до него все работало и с автоматически сгенерированным конструктором.


"Но черт возьми, Холмс, как?"

Мне вот было любопытно, как в Class1 создается и инициализируется что-то связанное с Class2, при этом не имея определения Class2.
Но, похоже, там просто unique_ptr, который изначально пустой, а значение ему назначается позже. Что-то вроде:
class Class1 {
  std::unique_ptr<Class2> ptr_member_;

  void do_something(); // Реализовано в .cpp-файле.
  ...
};

void Class1::do_something() {
  if(!ptr_member_) ptr_member_ = std::make_unique<Class2>(...);
  ...
}

Тогда работа дефолтного, сгенерированного компилятором конструктора становится понятной.
Re[25]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 12:25
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Для рассматриваемого случая принципиальной разницы нет — что дефолтный конструктор, определенный компилятором, что дефолтный конструктор, определенный пользователем в теле класса, — оба варианта приводят к одной и той же ошибке.


Этот вариант уже предлагали и вот мой ответ на него: https://rsdn.org/forum/cpp/8557491.1
Автор: Shmj
Дата: 06.07.23


В общем, чует моя душа — придется таки выцеживать из проекта мин. код.
=сначала спроси у GPT=
Re[26]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 12:29
Оценка: +4
Здравствуйте, Shmj, Вы писали:

S>Этот вариант уже предлагали и вот мой ответ на него: https://rsdn.org/forum/cpp/8557491.1
Автор: Shmj
Дата: 06.07.23


S>В общем, чует моя душа — придется таки выцеживать из проекта мин. код.


А моя душа чует, что ты немножко гонишь.

Когда тебя начали тыкать носом, что ты не можешь нормально описать случай, ты ответил следующее:

http://rsdn.org/forum/cpp/8557130.1
Автор: Shmj
Дата: 05.07.23


Мне не нужно знать в чем проблема была именно в том частном случае.
Мне нужно понимание почему вообще перенос пустого конструктора в H-файл может приводить к ошибке компиляции — какая разница компилятору?


Когда тебе ответили на поставленный вопрос: "почему вообще так может быть?", оказалось, что "у тебя был другой кейс". Так ты сам определись сначала, что ты хочешь — чтоб твои "этюды" решали, или чтоб тебе разрулили то, что ты там наговнокодил за кулисами, и не морочь людям головы.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 06.07.2023 12:49 rg45 . Предыдущая версия . Еще …
Отредактировано 06.07.2023 12:36 rg45 . Предыдущая версия .
Отредактировано 06.07.2023 12:35 rg45 . Предыдущая версия .
Отредактировано 06.07.2023 12:34 rg45 . Предыдущая версия .
Re[27]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 12:52
Оценка: :))) :))
Здравствуйте, rg45, Вы писали:

R>Когда тебе ответили на поставленный вопрос: "почему вообще так может быть?", оказалось, что "у тебя был другой кейс". Так ты сам определись сначала, что ты хочешь — чтоб твои "этюды" решали, или чтоб тебе разрулили то, что ты там наговнокодил за кулисами, и не морочь людям головы.


В принципе да, на первоначальный вопрос ответили. Но тут же начало распирать любопытство — а как же у меня могло работать с конструктором по умолчанию? Ну не создавать же новую тему?
=сначала спроси у GPT=
Re[28]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 13:02
Оценка:
Здравствуйте, Shmj, Вы писали:

S>В принципе да, на первоначальный вопрос ответили. Но тут же начало распирать любопытство — а как же у меня могло работать с конструктором по умолчанию? Ну не создавать же новую тему?


На колу мочало, начинай сначала: http://rsdn.org/forum/cpp/8556819.1
Автор: so5team
Дата: 05.07.23
--
Справедливость выше закона. А человечность выше справедливости.
Re[28]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 13:10
Оценка:
Здравствуйте, Shmj, Вы писали:


S>Но тут же начало распирать любопытство — а как же у меня могло работать с конструктором по умолчанию?


Вообще, странный вопрос — в каком смысле "могло"? Сейчас у же перестало, что ли? Так может помимо этого были сделаны еще какие-то изменения, не рассматривал такой вариант?
--
Справедливость выше закона. А человечность выше справедливости.
Re[29]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 14:29
Оценка: :)
Здравствуйте, rg45, Вы писали:

S>>Но тут же начало распирать любопытство — а как же у меня могло работать с конструктором по умолчанию?


R>Вообще, странный вопрос — в каком смысле "могло"? Сейчас у же перестало, что ли? Так может помимо этого были сделаны еще какие-то изменения, не рассматривал такой вариант?


Можно и сейчас сделать. Может потом займусь, если никто не догадается как такое можно сделать.
=сначала спроси у GPT=
Re[28]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 14:34
Оценка:
Здравствуйте, Shmj, Вы писали:


S>Но тут же начало распирать любопытство — а как же у меня могло работать с конструктором по умолчанию?


И научись уже использовать правильную терминологию, чтоб не приходилось тебя разгадывать как ребус. Конструкторы по умолчанию бывают определенные пользователем и могут быть определены неявно компилятором. Так какой из них ты имел в виду? (Можешь не отвечать, вопрос риторический).
--
Справедливость выше закона. А человечность выше справедливости.
Re[30]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 14:43
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Может потом займусь, если никто не догадается как такое можно сделать.


Да давно уже догадались
Автор: so5team
Дата: 06.07.23
. Можете закоментировать конструктор/деструктор в demo.hpp/cpp и все будет компилироваться. А если определите конструктор по умолчанию прямо в demo.hpp, то перестанет.

Так что решение вашему условию
Автор: Shmj
Дата: 06.07.23
удовлетворяет. Но есть подозрение, что это не то, что вам было нужно.
Re[30]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 14:57
Оценка: 4 (1) +1
Здравствуйте, Shmj, Вы писали:

S>Можно и сейчас сделать. Может потом займусь, если никто не догадается как такое можно сделать.


Да пожалуйста (как же ты надоел):

http://coliru.stacked-crooked.com/a/3ff6997251bdabcc

#include <memory>

class Class1
{
public:

   // Class1() {}
   explicit Class1(int);
   ~Class1();

private:

   class Impl;

   std::unique_ptr<Impl> m;
};

int main()
{
}


Раскомментируешь дефолтный конструктор, определенный инлайном в классе, и — получите, распишитесь:

http://coliru.stacked-crooked.com/a/1840c0de42ea99a3

g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
/usr/local/include/c++/12.1.0/bits/unique_ptr.h:93:23: error: invalid application of 'sizeof' to incomplete type 'Class1::Impl'
   93 |         static_assert(sizeof(_Tp)>0,
      |                       ^~~~~~~~~~~


Выносим определение дефолтного конструктора в cpp, и снова все чики-пуки:

http://coliru.stacked-crooked.com/a/a866ea1051987c33
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 06.07.2023 15:13 rg45 . Предыдущая версия . Еще …
Отредактировано 06.07.2023 15:04 rg45 . Предыдущая версия .
Re[31]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 15:00
Оценка:
Здравствуйте, so5team, Вы писали:

S>Да давно уже догадались
Автор: so5team
Дата: 06.07.23
. Можете закоментировать конструктор/деструктор в demo.hpp/cpp и все будет компилироваться. А если определите конструктор по умолчанию прямо в demo.hpp, то перестанет.


In file included from /Users/test/Desktop/cmake_test/main.cpp:1:
/Users/test/Desktop/cmake_test/Class1.h:11:11: error: variable has incomplete type 'Class2'
C v;
^
/Users/test/Desktop/cmake_test/Class1.h:15:13: note: in instantiation of function template specialization 'Class1::get_v<Class2>' requested here
int v_{ get_v<Class2>() };
^
/Users/test/Desktop/cmake_test/Class1.h:6:7: note: forward declaration of 'Class2'
class Class2;
^
1 error generated.


Вот странно, у меня такая ошибка с вашим оригинальным кодом, ничего не переносил в H-файл.
=сначала спроси у GPT=
Re[32]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 15:06
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот странно, у меня такая ошибка с вашим оригинальным кодом, ничего не переносил в H-файл.


У меня с clang-16 OK, с clang-14 ошибка.
Re[31]: Ошибка, если конструктор определен в h-файле (этюд?)
От: serg_joker Украина  
Дата: 06.07.23 15:17
Оценка: +1 :))) :)))
Здравствуйте, rg45, Вы писали:

R>Да пожалуйста (как же ты надоел):

Слабак!
Re[32]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 15:21
Оценка:
Здравствуйте, serg_joker, Вы писали:

R>>Да пожалуйста (как же ты надоел):

_>Слабак!

И это не первая победа упрямства над разумом.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 06.07.2023 15:22 rg45 . Предыдущая версия .
Re[32]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 15:34
Оценка: 9 (1)
Здравствуйте, Shmj, Вы писали:

S>Вот странно, у меня такая ошибка с вашим оригинальным кодом, ничего не переносил в H-файл.


Вот этот вариант, вроде бы, работает вне зависимости от версии компилятора:

demo.hpp
#pragma once

#include <memory>

class Class1
{
public:

   Class1();
   ~Class1();

   static std::unique_ptr<Class1> make();

private:

   class Impl;

   std::unique_ptr<Impl> m;
};


demo.cpp
#include "demo.hpp"

class Class1::Impl {
};

Class1::Class1() {}
Class1::~Class1() {}

std::unique_ptr<Class1> Class1::make() { return std::make_unique<Class1>(); }


main.cpp
#include "demo.hpp"

int main() {
    auto c = Class1::make();
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.