2017-04-16 5 views
0

저는 오랫동안 C++ 게임 엔진을 개발해 왔습니다. Xcode 8.3.1로 업데이트하기 전까지는 컴파일러와 관련된 문제가 없었습니다.Xcode 8.3.1 - 컴파일러는 순환 참조를 더 이상 처리 할 수 ​​없습니까?

갑자기, 컴파일러가 간단히 순환 참조를 처리 할 수 ​​없도록 만든 기본 설정이 갑자기 변경된 것처럼 보입니다.

사람이 다시 (내가 엑스 코드를 다운 그레이드 시도하고 그것은 여전히 ​​작동하지 않습니다!)

내 원형 참조 이런 식으로 뭔가 보이는 설정하는 방법을 알고 있나요

: 나는 클래스가

  • 을 내 코드에 정의 된 소위 "개체"
  • 는 "개체" "Renderer2D"라는 다른 클래스를 포함
  • 는 "Renderer2D"는 "Renderable2D"
  • "렌더링 가능한라는 다른 클래스를 포함 Renderer2D "클래스 :

    #pragma once 
    
    #include "Renderable2D.h" 
    
    namespace kineticengine { 
        namespace graphics { 
    
         class Renderer2D { 
         protected: 
          Renderer2D() {} 
         public: 
          virtual void submit(const Renderable2D* renderable) {}; // Error here, "Unknown type name 'Renderable2D', did you mean 'Renderer2D'?" 
         }; 
    
        } 
    } 
    

    내"Renderable2D "클래스 :

    #pragma once 
    
    #include "Renderer2D.h"  
    #include "../../Object.h" 
    
    namespace kineticengine { 
        namespace graphics { 
         class Renderable2D : public Object { 
         public: 
          Renderable2D() : Object() {} 
    
          virtual ~Renderable2D() {} 
    
          void render(Renderer2D* renderer) const override { 
           renderer->submit(this); // Error here "Cannot initialize parameter of type 'const kineticengine::graphics::Renderer2D *' with an rvalue of type 'const kineticengine::graphics::Renderable2D *'" 
          } 
         }; 
    
        } 
    } 
    
    : 2D 객체"

내 "개체"

#pragma once 

#include "Graphics/2D/Renderer2D.h" 

namespace kineticengine { 

    class Object { 
    public: 
     Object(); 
     virtual ~Object() {} 

     virtual void render(graphics::Renderer2D* renderer) const; 
    }; 

} 

내 클래스 "를"확장 "

내 모든 오류는 기본적으로 "알 수없는 클래스 [x]"의 변형입니다. 여기서 x는 다른 클래스.

도움이 될 것입니다.

+0

[대표 테스트 케이스] (http://stackoverflow.com/help/mcve)를 보지 않으면 논평하기가 다소 어렵습니다. –

+0

예제를 추가했습니다 – flyingflouder86

+1

보고있는 오류와 함께 실제 * 코드를 추가하십시오. –

답변

1

Renderable2D.h는 Renderable2D 클래스를 정의하기 전에 Renderer2D.h를 포함하므로 Renderer2D.h가 Renderable2D 클래스를 참조하면 아직 정의되지 않았습니다. Clang은 올바르게 행동합니다.

이주기를 깨는 한 가지 방법은 포인터 또는 참조로 클래스를 참조하려는 경우 헤더를 포함하지 않는 것입니다. 그런 다음 include 지시문 대신 클래스의 전방 선언을 넣습니다. 이것은 컴파일 시간 단축의 추가 보너스를 가지고 있습니다.

+0

필자가 얻지 못하는 이유는 clang이 전에 0 에러와 0 경고로 컴파일 되었기 때문입니다. 이제는 모두 엉망입니다! – flyingflouder86