C++ 编译错误-静态成员

C++ 编译错误-静态成员,c++,static-methods,C++,Static Methods,我有一个带有虚拟方法的类定义 编译时,我得到一个错误,即'MethodType Class::Method'不是类的静态成员 我发现最流行的解决方案是在头文件的方法定义中添加关键字static 但是,该方法定义为虚拟。因此,要添加静态关键字,我必须删除虚拟关键字。不幸的是,这无法完成,因为该类继承自父类,该父类中的此方法也声明为virtual,从而导致另一个编译器错误。(请注意,我使用的是已定义的接口,无法访问父类的源代码) 有人有什么想法吗 头文件: class X : public Oth

我有一个带有虚拟方法的类定义

编译时,我得到一个错误,即
'MethodType Class::Method'
不是类的静态成员


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

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

有人有什么想法吗


头文件:

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'

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

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

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

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

我认为您有一个解析错误

你的班级定义是:

class X : public OtherClass {
   public:
      X();
     ~X();
     virtual structType MethodName(ParamType1,ParamTYpe2);
}; 
但是
MethodName
的定义具有不同的返回类型:

structType* X::MethodName(ParamType1 P1, ParamType2 P2) {
    //Implementation here
}
编译器并不确定该如何处理它,并且认为出于某种原因,您正试图对一个不存在的静态成员执行某些操作


解决方案是修复函数定义和声明,使函数具有一个单一的一致返回类型。无论是
structType
还是
structType*

我认为您有解析错误

你的班级定义是:

class X : public OtherClass {
   public:
      X();
     ~X();
     virtual structType MethodName(ParamType1,ParamTYpe2);
}; 
但是
MethodName
的定义具有不同的返回类型:

structType* X::MethodName(ParamType1 P1, ParamType2 P2) {
    //Implementation here
}
编译器并不确定该如何处理它,并且认为出于某种原因,您正试图对一个不存在的静态成员执行某些操作

解决方案是修复函数定义和声明,使函数具有一个单一的一致返回类型。要么
structType
要么
structType*

找到了答案

最后。在MethodName1的实现中

     structType * X::MethodName(ParamType1 P1, ParamType2 P2)
ParamType1是非标准类型。它实际上是底层应用程序中的一个类 我只有API

结果表明类ParamType1的实现丢失/未编译/某些东西

链接的问题与我加载的类无关,尽管由于编译器提供的代码行,它看起来是这样的。 因此,为了便于将来参考,在函数定义中使用类和结构时,请注意此链接错误

再次感谢大家的帮助。

大家都明白了

最后。在MethodName1的实现中

     structType * X::MethodName(ParamType1 P1, ParamType2 P2)
ParamType1是非标准类型。它实际上是底层应用程序中的一个类 我只有API

结果表明类ParamType1的实现丢失/未编译/某些东西

链接的问题与我加载的类无关,尽管由于编译器提供的代码行,它看起来是这样的。 因此,为了便于将来参考,在函数定义中使用类和结构时,请注意此链接错误


再次感谢大家的帮助。

我们需要查看您的类定义。目前我不知道你在问什么,这没有多大意义。如果要重写的基函数是
virtual
,则从重写它的派生函数中删除关键字
virtual
,不会导致编译错误;事实上,它什么都不做!你能提供一些代码吗?最可能的情况是,您像静态方法一样调用该方法,而不是像实例方法一样。“我发现最流行的解决方案是将关键字static添加到头文件中的方法定义中。”,“因此,要添加静态关键字,我必须删除虚拟关键字。”-请花时间学习这些关键字背后的概念,这些不是让代码编译的随机开/关开关。@Laurynas Biveinis:我理解关键字背后的概念,正如我所说的,如果我删除“virtual”关键字,那么我会得到另一个错误无法声明方法,因为在基类中声明了vitrual方法“我们需要查看您的类定义。目前我不知道你在问什么,这没有多大意义。如果要重写的基函数是
virtual
,则从重写它的派生函数中删除关键字
virtual
,不会导致编译错误;事实上,它什么都不做!你能提供一些代码吗?最可能的情况是,您像静态方法一样调用该方法,而不是像实例方法一样。“我发现最流行的解决方案是将关键字static添加到头文件中的方法定义中。”,“因此,要添加静态关键字,我必须删除虚拟关键字。”-请花时间学习这些关键字背后的概念,这些不是让代码编译的随机开/关开关。@Laurynas Biveinis:我理解关键字背后的概念,正如我所说的,如果我删除“virtual”关键字,那么我会得到另一个错误方法无法声明,因为vitrual方法是在基类“中声明的,并且它不是“方法”。@centro和@Tomalak Geret'kal:class X:public OtherClass{public:X();~X();virtual structType MethodName(ParamType1,ParamTYpe2);};然后在CPP文件中我有:structType*X::MethodName(ParamType1 P1,ParamType2 P2){//Implementation here}并且被标记为错误:“struct