编译错误 - 静态成员

时间:2011-05-27 09:00:04

标签: c++ static-methods

我有一个带有虚拟方法的课程定义。

在编译时,我收到错误'MethodType Class::Method'不是类的静态成员 Class

我发现最流行的解决方案是将关键字 static 添加到头文件中的Method定义中。

但是,该方法定义为虚拟。因此,要添加静态关键字,我必须删除虚拟关键字。遗憾的是,由于该类继承了此方法也声明为虚拟的父类,因此无法完成,从而导致另一个编译器错误。 (请注意,我使用的是已定义的接口,无法访问父类的源代码)

有没有人有任何想法?


标题文件:

class X : public OtherClass
{
   public:
      X();
      ~X();  

     virtual structType MethodName(ParamType1,ParamType2);

};

然后在CPP文件中我有:

structType * X::MethodName(ParamType1 P1, ParamType2 P2)
{
   //Implementation here
}

这会被标记为错误:

'structType* X::MethodName' is not a static member of 'class X'

3 个答案:

答案 0 :(得分:3)

如果要在没有该类对象的情况下调用方法,则必须将其设为static。这对虚拟方法毫无意义 您必须创建该类的对象,然后调用该方法。

struct X {
   static int bar();
   int foo();

};

X::bar(); // Works, static method called
X::foo(); // Doesn't work (your problem)

X x;
x.bar(); // Works, but X::bar() recommended (so that one sees that it's static...)
x.foo(); // Works, your solution

答案 1 :(得分:3)

我认为你有一个解析错误。

你的班级定义说:

class X : public OtherClass {
   public:
      X();
     ~X();
     virtual structType MethodName(ParamType1,ParamTYpe2);
}; 

但是您对MethodName的定义有不同的返回类型:

structType* X::MethodName(ParamType1 P1, ParamType2 P2) {
    //Implementation here
}

编译器并不确定如何做到这一点,并且认为你正试图用不存在的静态成员做某事,出于某种原因。

解决方案是修复函数​​定义和声明,以便函数具有一个单一的一致返回类型。 structTypestructType*

答案 2 :(得分:0)

想出来。

最后。在MethodName1

的实现中
     structType * X::MethodName(ParamType1 P1, ParamType2 P2)

ParamType1是非标准类型。它实际上是底层应用程序中的一个类 我只有API。

事实证明,类ParamType1的实现缺失/未编译/某事。

链接的问题与我加载的类没有关系,即使它因为编译器提供的行而显得如此。 因此,为了将来参考,在函数定义中使用类和结构时,请留意这个链接错误。

再次感谢所有人的协助。