3

私はこの問題を抱えています...

私は私の構造を持っています:

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
4

3 に答える 3

9

スコープ解決演算子を使用して呼び出す必要があります。

MyClass::MyStaticMethod(s,t);
       ^^
于 2012-04-04T10:48:45.697 に答える
1

「MyClass::MyStaticMethod(s、t);」を使用する以外に、インスタンスで静的メソッドを呼び出すこともできます。

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

そしてそれは読むべきです:

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

(新しいタイプ名が最後になります)

于 2012-04-04T11:04:56.483 に答える
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 );
};

意味が異なる場合:メンバーは特定のインスタンスではなく、クラスに属します。この場合、関数は2つの方法のいずれかで呼び出すことができます。最も一般的な方法は次のとおりです。

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

言語でも許可されていますが(使用することはお勧めしませんが、混乱する可能性があります):

float f a.MyStaticFunction(a,b);

クラスで静的メンバー関数を呼び出すのではなく、でメンバー関数を呼び出すように見えるために混乱が生じる場合。a

于 2012-04-04T12:00:17.230 に答える