请看一下这段代码:
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编译它的大学服务器。我能做什么?有什么我想念的吗?
答案 0 :(得分:7)
您无法创建对r值的(可变)引用。尝试使用const-reference:
int f(const typename A<T>::base& arg = typename A<T>::derived())
// ^^^^^
当然,您无法使用const-reference修改arg
。如果必须使用(可变)引用,请使用重载。
int f(base& arg) {
...
}
int f() {
derived dummy;
return f(dummy);
}
答案 1 :(得分:4)
您面临的问题是您不能将临时默认参数用作采用非const引用的函数。 Temporaries不能绑定到非const引用。
如果您没有在内部修改对象,则可以将签名更改为:
int f(typename A<T>::base const & arg = typename A<T>::derived())
如果您实际上正在修改传入的参数,则必须使用其他一些技术来允许可选参数,其中最简单的是使用可以默认为NULL的指针。