Как вы заметили, set(source);
является источником (не каламбур) проблемы. Это не совсем то, что вы думаете - это не попытка вызвать копию ctor. Вместо этого он в основном эквивалентен: set source;
- то есть он пытается определить set
объект с именем source
- круглые скобки избыточны, но разрешены.
Вы можете вызвать копию ctor в ctor (или где угодно), но в любом случае это не приведет к тому, что вы хотите - копия ctor создает копию, поэтому, даже если вы ее вызывали, она бы просто создайте временный объект, который испарится в конце этого оператора.
Как уже упоминалось, вам, вероятно, нужна частная функция для копирования данных из одного объекта в другой, а затем использовать их как из своего ctor-копии, так и из вашего оператора назначения копирования. Более того, определите его, используя объекты, которые могут обрабатываться корректно с помощью ctor по умолчанию и операторов назначения копирования.