我试图将length的当前值作为默认参数作为函数参数传递。 但编译器显示错误
“'此'可能不会在此上下文中使用”
任何人都能告诉我我犯的错误是什么。 ?
class A
{
private:
int length;
public:
A();
void display(int l=this->length)
{
cout<<"the length is "<<l<<endl;
}
};
int main()
{
A a;
a.display();
return 0;
}
答案 0 :(得分:14)
您的会员功能:
void display(int l=this->length)
在概念上等同于:
void display(A * this, int l=this->length); //translated by the compiler
这意味着,你在表达式中使用了一个参数,这是C ++中不允许的其他参数的默认参数,如§8.3.6/ 9(C ++ 03)所述,
每个都会评估默认参数 调用函数的时间。 订单 函数参数的评估是 未指定的。 因此,参数 不得使用函数 默认参数表达式,即使 他们没有被评估。
请注意,C ++不允许这样做:
int f(int a, int b = a); //illegal : §8.3.6/9
解决方案是添加一个不带参数的重载:
void display()
{
display(length); //call the other one!
}
如果您不想再添加一个功能,那么为参数选择一个不可能的默认值。例如,由于它描述的 length 永远不会是负数,因此您可以选择-1
作为默认值,并且可以将您的函数实现为:
void display(int l = -1)
{
if ( l <= -1 )
l = length; //use it as default value!
//start using l
}
答案 1 :(得分:3)
您可以改为使用用户重载和转发。
class A
{
private:
int length;
public:
A();
void display()
{
display(this->length);
}
void display(int l)
{
cout<<"the length is "<<l<<endl;
}
};
答案 2 :(得分:1)
在编译时,没有对象,所以没有。
如果该成员函数可以访问属性本身,为什么要将对象的一个属性作为默认值传递给成员函数?