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