derived class as default argument g++

半腔热情 提交于 2019-12-10 13:24:03

问题


Please take a look at this code:

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;
}

Compiling generates the following error message in 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'

The basic idea (using derived class as default value for base-reference-type argument) works in visual studio, but not in g++. I have to publish my code to the university server where they compile it with gcc. What can I do? Is there something I am missing?


回答1:


You cannot create a (mutable) reference to an r-value. Try to use a const-reference:

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

Of course you can't modify arg with a const-reference. If you have to use a (mutable) reference, use overloading.

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



回答2:


The problem you are facing is that you cannot use a temporary as default argument to a function taking a non-const reference. Temporaries cannot be bound to non-const references.

If you are not modifying the object internally, then you can just change the signature to:

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

If you are actually modifying the passed in argument, you must use some other technique to allow for optional arguments, simplest of which would be using a pointer that can be defaulted to NULL.



来源:https://stackoverflow.com/questions/2653182/derived-class-as-default-argument-g

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!