2011-07-06 7 views
1

**編集:これはllvmでのみ発生します。 gccはこれをうまくサポートしています。objective-C++:objective-cクラスを返し、共変リターンを使うメソッドでC++クラスを定義することは可能ですか?

以下を考慮してください。

Objective-CのクラスAとB

Bは、我々は、C++のように見えるhiearchyたいA.

のサブクラスである:、あなたがこれを行う場合は、しかし、

class X { 
    //... 
    public: 
    virtual A* getFoo(); 
}; 
class Y : public X { 
    //... 
    public: 
    B* getFoo(); 
}; 

error: virtual function 'getFoo' has a different return type ('Y *') than the function it overrides (which has return type 'X *') 

私は思ったんだけど:あなたはObjective-Cのタイプは、C++コンパイラを混乱させるとして、エラーが発生します誰かがこれに対する回避策を持っていれば? (明らかに、長期的には、Objective-cクラスから離れることになりますが、それは今日ではありません)。

P.S. Thisは私が見つけることができる最も類似した質問のようですが、私はそれが別の問題だと確信しています。

答えて

0

これは、コンパイルし、私のために正常に動作:

#import <Cocoa/Cocoa.h> 

@interface A : NSObject 

- (NSString*) bar; 

@end 

@implementation A 

- (NSString*) bar 
{ 
    return @""; 
} 

@end 

@interface B : A 
@end 

@implementation B 

- (NSString*) bar 
{ 
    return @"!!!"; 
} 

@end 

class X { 
    //... 
    public: 
    virtual A* getFoo() = 0; 
}; 

class Y : public X { 
    //... 
    public: 
    virtual B* getFoo() { return [B new]; } 
}; 


int main (int argc, char const *argv[]) 
{ 
    X* x = new Y; 
    NSLog(@"%@", [x->getFoo() bar]); // >> !!! 

    return 0; 
} 

はたぶん、あなたの問題は、Yを定義ファイルにBのヘッダファイルをインポートしていなかったということでしたか?コンパイラは、Bは、あなたの質問に答えるために、とにかくY.

をコンパイルするために、Aから継承することを知っている必要があることが可能であるように見えるのようにして、不完全なクラスに(少なくとも、Cの++で)共分散を取得することはできませんこれをする。

+0

ああ、これはllvmでのみ発生します:/私は質問を更新しましたが、本当の答えはここでllvmに対するバグを報告することです:http://llvm.org/bugs/show_bug.cgi?id= 10309 –

+0

これが修正されるまでg ++を元に戻せない場合は、回避策としてIDを返すことができると思います。 –

関連する問題