производный класс как параметр по умолчанию g ++

Смотрите на этот код:

template<class T>
class A
{
 class base
 {

 };

 class derived : public A<T>::base
 {

 };

public:

 int f(typename A<T>::base& arg = typename A<T>::derived())
 {
  return 0;
 }
};

int main()
{
 A<int> a;
 a.f();
 return 0;
}

Компиляция генерирует следующее сообщение об ошибке в g ++:

test.cpp: In function 'int main()':
test.cpp:25: error: default argument for parameter of type
                    'A<int>::base&' has type 'A<int>::derived'

Основная идея (использующий производный класс в качестве значения по умолчанию для аргумента основного ссылочного типа) работает в Visual Studio, но не в g ++. Я должен опубликовать свой код к университетскому серверу, где они компилируют его с gcc. Что я могу сделать? Есть ли что-то, что я пропускаю?

6
задан Georg Fritzsche 16 April 2010 в 13:41
поделиться

2 ответа

Вы не можете создать (изменяемую) ссылку на r-значение. Попробуйте использовать константную ссылку:

 int f(const typename A<T>::base& arg = typename A<T>::derived())
//     ^^^^^

Конечно, вы не можете изменить arg константной ссылкой. Если вам нужно использовать (изменяемую) ссылку, используйте перегрузку.

 int f(base& arg) {
   ...
 }
 int f() {
   derived dummy;
   return f(dummy);
 }
7
ответ дан 9 December 2019 в 22:31
поделиться

Проблема, с которой вы столкнулись, заключается в том, что вы не можете использовать временный аргумент в качестве аргумента по умолчанию для функции, принимающей неконстантную ссылку. Временные объекты не могут быть привязаны к неконстантным ссылкам.

Если вы не изменяете объект внутренне, вы можете просто изменить подпись на:

int f(typename A<T>::base const & arg = typename A<T>::derived())

Если вы действительно изменяете переданный аргумент, вы должны использовать другой метод, позволяющий использовать необязательные аргументы, простейший из которых будет использовать указатель, который по умолчанию может иметь значение NULL.

4
ответ дан 9 December 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: