我的问题示意图......
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
为什么会发生这种情况,我该怎么做才能解决这个问题?
答案 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