c ++公开继承的类成员不能用作默认参数

时间:2010-01-29 02:35:12

标签: c++ inheritance arguments default

我的问题示意图......

class A
{
public:
    // etc.
protected:
    uint num;
};

class B : public A
{
public: 
    void foo(uint x = num); //bad
};

给出了这个错误:

error: invalid use of non-static data member ‘A::num’
error: from this location

为什么会发生这种情况,我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:4)

我怀疑这种情况发生了(基于对非静态性的抱怨),因为它没有this指针用于知道它应该得到的哪个 B实例{{1来自。

Microsoft编译器(至少)允许您指定表达式,但不能指定非静态成员。来自MSDN

  

用于默认的表达式   参数通常是不变的   表达式,但这不是一个   需求。表达可以   组合可见的功能   目前的范围,不变   表达式和全局变量。该   表达式不能包含本地   变量或非静态类成员   变量

这方面的解决方案很多,而其他人则指出了一些。这是您可能会或可能不喜欢的另一个:

num

答案 1 :(得分:4)

您可以使用重载而不是默认参数。

class A
{
public:
    // etc.
protected:
    uint num;
};

class B : public A
{
public: 
    void foo(uint x);
    void foo() { foo( num ); }
};

答案 2 :(得分:1)

你可以创建2个foos

foo()//在内部使用num

foo(int x)//使用x