производный класс в качестве аргумента по умолчанию g ++ - PullRequest
6 голосов
/ 16 апреля 2010

Пожалуйста, посмотрите на этот код:

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'

Основная идея (использование производного класса в качестве значения по умолчанию для аргумента base-reference-type) работает в visual studio, но не в g ++. Я должен опубликовать свой код на сервере университета, где они компилируют его с помощью gcc. Что я могу сделать? Что-то мне не хватает?

Ответы [ 2 ]

7 голосов
/ 16 апреля 2010

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

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

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

 int f(base& arg) {
   ...
 }
 int f() {
   derived dummy;
   return f(dummy);
 }
4 голосов
/ 16 апреля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...