带有struct参数的c ++静态方法

时间:2012-04-04 10:48:04

标签: c++ visual-studio-2010 struct compiler-errors static-methods

我有这个问题......

我有一个我的结构:

typedef struct Mystruct{
  float a;
  float b;
}

和静态方法:

float static MyStaticMethod(MyStruct a, MyStruct b);

当我打电话给这个方法时:

Mystruct s;
s.a = 1;
s.b = 2;

Mystruct t;
t.a = 1;
t.b = 2;

MyClass.MyStaticMethod(s,t);

我在编译时遇到这个错误:

Error   51  error C2228: left of '.MyStaticMethod' must have class/struct/union

Error   50  error C2275: 'MyClass' : illegal use of this type as an expression

3 个答案:

答案 0 :(得分:9)

您需要使用范围解析运算符调用它:

MyClass::MyStaticMethod(s,t);
       ^^

答案 1 :(得分:1)

除了使用“MyClass :: MyStaticMethod(s,t);”之外,您还可以在实例上调用静态方法:

MyClass instance;
instance.MyStaticMethod(s,t);

它应该是:

typedef struct {
  float a;
  float b;
} Mystruct;

(新的名字是最后一个)

答案 2 :(得分:1)

关键字static在C ++语言中重载(即它有多种含义)。在您提供的代码中:

struct MyStruct {
};
static float MyStaticFunction( MyStruct, MyStruct );

static的含义是内部链接(即该符号在当前翻译单元之外不可用。如果在标题中存在,则每个包含翻译单元将得到它自己的函数副本。在这种情况下,使用是自由函数的用法:

MyStruct a,b;
float f = MyStaticFunction( a, b );

在尝试使用它时,您的意思似乎是在此备用方案中使用static

struct MyStruct {
   static float MyStaticFunction( MyStruct, MyStruct );
};

它有不同的含义:该成员属于该类,而不属于特定实例。在这种情况下,可以通过两种方式之一调用该函数,最常见的方法是:

MyStruct a,b;
float f = MyStruct::MyStaticFunction( a, b );

尽管该语言也允许(我不建议使用它,但可能会令人困惑):

float f a.MyStaticFunction(a,b);

出现混淆的地方,因为它看起来像是在a上调用成员函数,而不是在类上调用静态成员函数。