c++ publicly inherited class member cannot be used as default argument

arguments, c++, default, inheritance

Solution

I suspect this happens (based on the complaint about non-staticness) because there is no `this` pointer for it to use to know which instance of B it should get `num` from.

The Microsoft compiler (at least) allows you to specify an expression, but not a non-static member. From MSDN:

The expressions used for default arguments are often constant expressions, but this is not a requirement. The expression can combine functions that are visible in the current scope, constant expressions, and global variables. The expression cannot contain local variables or non-static class-member variables.

Work-arounds for this are numerous and others have pointed out a few. Here's one more which you may or may not like:

void foo(uint* x = NULL) {
  uint y = (x == NULL ? num : *x);
  // use y...
}

Problem

A schematic of my problem... ``` class A { public: // etc. protected: uint num; }; class B : public A { public: void foo(uint x = num); //bad }; ``` gives this error: ``` error: invalid use of non-static data member ‘A::num’ error: from this location ``` Why does this happen, and what can I do to work around this?

Original source