Как заставить его скомпилироваться, не меняя порядок всего?
Вам не нужно менять порядок всего , но вам нужно изменить порядок что-то . В частности, object
должно быть определено до вызова getObject
(в выражении аргумента по умолчанию).
Можно ли сделать решение без разделения объявлений?
Немного неясно, что это значит, но если вы определите object
вверху, тогда объявления могут остаться точно такими же, как в вашем примере.
Другой вариант - повторно объявить функцию с аргументом по умолчанию после определения object
:
class object;
object getObject();
void doSomething(object o);
class object{
public:
int num = 0;
};
void doSomething(object o = getObject());
Это, конечно, будет означать, что код после первого объявления, но до повторного объявления не получит преимущества от аргумента по умолчанию.
Наконец, немного хитрости. Выражения в шаблонах не должны быть полными, пока не будет создан экземпляр шаблона, поэтому ваш пример будет работать нормально, если бы doSomething
был шаблоном функции:
template<class T=void>
void doSomething(object o = getObject());
class object{};
object getObject(){
return {};
}
template<class T>
void doSomething(object o){}
Конечно, вы не должны создавать шаблон только для того, чтобы обойти эту проблему, но это удобная деталь, о которой нужно знать, когда вы пишете шаблоны.