Вопрос

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

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. Что я могу сделать? Есть ли что-то, чего мне не хватает?

Это было полезно?

Решение

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

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

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

 int f(base& arg) {
   ...
 }
 int f() {
   derived dummy;
   return f(dummy);
 }

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top