2011-07-06 7 views
1

** 편집 : 이것은 단지 LLVM으로 발생; gcc는 이것을 잘 지원합니다.대물-C++ : 그것은 목표 -C 클래스를 반환 공변 복귀를 사용하는 방법은 C++ 클래스를 정의하는 것이 가능하다?

다음을 고려하십시오.

오브젝티브 C 클래스 A와 B

B 우리는 보이는 C++ 관계의 계층을 원하는

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 *') 

궁금 해요 : 당신은 목표 - C 타입은 C++ 컴파일러를 혼란과 같은 오류가 발생합니다 누군가가 이것에 대한 해결책을 가지고 있다면? (분명히, 장기적으로 우리는 Objective-c 클래스에서 벗어날 것이지만, 오늘날은 그렇지 않습니다.)

P. 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++에서는 최소한).

어쨌든 질문에 대답하는 것이 가능해 보입니다. 이것을하기 위해./내가 질문을 업데이 트했습니다하지만 난 여기 진짜 대답은 LLVM에 대한 버그를 제기 할 것 같다 :

+0

아, 이것은 단지 LLVM으로 발생 http://llvm.org/bugs/show_bug.cgi?id= 10,309 –

+0

다시 전환 할 수 없다면 g ++이 고정됩니다 때까지, 당신이 해결 방법으로 ID를 반환 할 수 같아요. –

관련 문제