【问题标题】:Compilation error - Static member编译错误 - 静态成员
【发布时间】:2011-05-27 09:00:03
【问题描述】:

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

在编译时,我收到'MethodType Class::Method' 不是 class Class

的静态成员的错误

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

但是,该方法被定义为virtual。因此,要添加 static 关键字,我必须删除 virtual 关键字。不幸的是,这不能完成,因为该类继承自该方法也声明为 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'

【问题讨论】:

  • 我们需要查看您的类定义。目前我不知道你在问什么。
  • 这没有多大意义。如果您要覆盖的基函数是virtual,那么从覆盖它的派生函数中删除关键字virtual 确实not 会导致编译错误;事实上它什么也没做!
  • 你能提供一些代码吗?很可能您将方法称为静态方法,而不是实例方法。
  • "我发现最流行的解决方案是在头文件的方法定义中添加关键字 static。", "所以要添加 static 关键字,我必须删除 virtual 关键字。" - 请花时间学习这些关键字背后的概念,这些不是随机的开关来编译代码。
  • @Laurynas Biveinis:我理解关键字背后的概念,正如我所说,如果我删除“virtual”关键字,毫无理由我会得到另一个错误。 '由于基类中声明了虚拟方法,因此无法声明方法"

标签: c++ static-methods


【解决方案1】:

如果您想在没有该类的对象的情况下调用方法,您必须将其设为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

【讨论】:

  • 而且不叫“方法”。
  • @centro 和@Tomalak Geret'kal:X 类:public OtherClass { public: X(); 〜X();虚拟结构类型方法名称(ParamType1,ParamTYPE2); };然后在 CPP 文件中我有: structType * X::MethodName(ParamType1 P1, ParamType2 P2) { //Implementation here } 这被标记为错误: 'structType* X::MethodName' 不是 'class 的静态成员X'
  • @GreaetCthulhu:请将其编辑到问题中。类定义、你如何使用它、你期望什么以及你实际看到什么。我们不知道问题是什么。
【解决方案2】:

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

你的类定义说:

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

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

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

编译器并不确定该怎么做,并认为您出于某种原因尝试使用不存在的静态成员做某事。

解决方案是修正你的函数定义和声明,使函数具有单一、一致的返回类型。 structTypestructType*

【讨论】:

  • 感谢您的帮助。我修复了两个返回类型匹配(这对我来说是一个愚蠢的疏忽)。但是编译器仍然告诉我 X::MethodName 不是 X 类的统计成员。
  • 最新更新:我很沮丧,将文件移动到备份空间。我创建了新文件并将代码从旧文件复制到新文件。他们编译得很好。这让我很怀疑,所以我在另外两台机器上编译了新文件,没有问题。当我将旧文件移动到其他机器时,它们仍然无法编译。我想我一定是在复制过程中遗漏了一些东西,所以我使用 diff 检查旧文件和新文件,diff 报告没有差异。我认为把它写成奇怪的 Unix 巫术是安全的。感谢大家的帮助。
  • @GreatCthulhu:请写下您的解决方案作为问题的答案,并接受它。
  • 我不能在发布问题的前 8 小时内这样做,因为我的代表少于 100。我会尽快这样做。感谢您的帮助,很抱歉浪费您的时间。
【解决方案3】:

想通了。

最后。在MethodName1的实现中

     structType * X::MethodName(ParamType1 P1, ParamType2 P2)

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

原来 ParamType1 类的实现丢失/未编译/某些东西。

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

再次感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多