2011-07-06 51 views
1

**編輯:這隻發生在llvm; gcc支持這一點很好。objective-C++:是否可以使用返回objective-c類並使用協變返回的方法來定義C++類?

請考慮以下情況。

Objective-C類A和B.

B是A

的子類,我們希望有一個C++ hiearchy,看起來像:

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

但是,如果你這樣做,你會得到一個錯誤,因爲Objective-c類型混淆了C++編譯器:

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

我想知道如果有人對此有解決方法? (顯然,從長遠來看,我們將遠離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; 
} 

也許你的問題是,您沒有導入B的頭文件到定義Y中的文件?因爲編譯器需要知道B從A繼承來編譯Y,所以你不能得到協變量(至少在C++中),因爲編譯Y.

無論如何,要回答你的問題,看起來像是可能的去做這個。

+0

啊,這隻發生在llvm上:/我已經更新了這個問題,但我想這裏的真正答案是提交一個針對llvm的錯誤:http://llvm.org/bugs/show_bug.cgi?id= 10309 –

+0

如果你不能切換回g ++,直到它被修復,我想你可以返回id作爲解決方法。 –

相關問題