2012-05-21 2 views
1

여기서 잘못된 점을 파악할 수 없습니다.
목록을 정렬하고이를 비교하는 비교 기능이 필요합니다.
정확하게 내 문제가 해결되었지만 나에게 적합하지 않은 코드 예제를 찾았습니다.
오류 :하지 내 타입은 ISO C++이없는 유형C++에서 ... 구조체를 함수에 전달하는 동안 형식 오류가 발생하지 않습니다.

와 '셀'의 선언을 금지인가

난 항상이 오류가?

AStarPlanner.h

class AStarPlanner { 

public: 

    AStarPlanner(); 

    virtual ~AStarPlanner(); 

protected: 

    bool compare(const Cell& first, const Cell& second); 

    struct Cell { 

     int x_; 
     int y_; 
     int f_; // f = g + h 
     int g_; // g = cost so far 
     int h_; // h = predicted extra cost 

     Cell(int x, int y, int g, int h) : x_(x), y_(y), g_(g), h_(h) { 
       f_ = g_ + h_; 
     } 
    }; 

}; 

AStarPlanner.cpp

bool AStarPlanner::compare(const Cell& first, const Cell& second) 
{ 
    if (first.f_ < second.f_) 
     return true; 
    else 
     return false; 
} 

답변

7

이동 메소드 선언 이전 Cell 선언 할 수는 없습니다.

class AStarPlanner { 
public: 
    AStarPlanner(); 
    virtual ~AStarPlanner(); 
protected: 
    struct Cell { 
     int x_; 
     int y_; 
     int f_; // f = g + h 
     int g_; // g = cost so far 
     int h_; // h = predicted extra cost 
     Cell(int x, int y, int g, int h) : x_(x), y_(y), g_(g), h_(h) { 
       f_ = g_ + h_; 
     } 
    }; 
    bool compare(const Cell& first, const Cell& second); 
}; 

또한, 기술적으로도 더 Cell 유형 없지만 AStarPlanner::Cell (그러나 그것은 class의 맥락에서 자동으로 해결 것).

4

클래스 선언 내부의 이름 가시성에 대한 C++ 규칙은 명확하지 않습니다. 예를 들어 멤버가 나중에 클래스에서 선언 된 경우에도 멤버를 참조하는 메서드 구현을 가질 수는 있지만 형식이 나중에 선언 된 경우 중첩 된 형식을 참조하는 메서드 선언을 가질 수 없습니다.

클래스 시작 부분에서 중첩 형식 선언을 이동하면 문제가 해결됩니다.

이 제한 사항에 대한 기술적 인 이유는 없습니다 (또는 그것이 더 좋을지 모르겠지만, 전체 C++ 파서 작성을 감히하지 못했습니다). 그러나 이것은 언어가 정의되는 방법입니다.

관련 문제