구조체 변수 전방 선언 ,프로토타입 선언 오류

조회수 1500회

Problem 구조체 변수를 타입으로 하는 큐를 사용하고 싶어서 변수를 선언했는데 오류가 나서 질문 올립니다.

예를 들면 structProblem{};라는게 있으면

queueQ;라는 변수를 사용하고 싶은데 정의되지 않은 형식을 사용했다고

오류 C2027 를 띄웁니다.

신기한점은 큐를 하면 에러가 생기는데 벡터는 에러가 없습니다

아래는 소스 코드입니다.

using namespace std;

struct Problem;//구조체 타입 전방 선언

queue<프로블럼>Q;//에러가 나는 부분

vector<프로블럼>Bank;//<>안에 영어를 쓰면 화면에 안보여서 한글로 했습니다..

struct Problem {

int arr[5] = { 3,3,0,0,0 };//초기 상태;

 int brr[5];

 Problem() {//생성자
          for (int i = 0; i < 5; i++) {   brr[i] = arr[i];     }
         Problem a = *this;    Bank.push_back(a);
       }

         void original() {//원본 유지
         for (int i = 0; i < 5; i++) { arr[i] = brr[i];}            
          }
     void clear() {//옮기기 전 상태로 이동
          for (int i = 0; i < 5; i++) {   brr[i] = arr[i];  }
         }

};

int main() { Problem mc;

cout << mc.arr[0] << mc.arr[1] << mc.arr[2] << mc.arr[3] << mc.arr[4] << endl; return 0; }

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • C2027 오류가 발생한 이유는 queue<Problem> Q; 변수가 생성될 때 Problem 이 정의되지 않아서입니다.

    전방 선언은 이러한 이름의 타입이 있다는 것만 알려줄 뿐, 해당 타입의 정의를 알려줄 수 없습니다.

    따라서 두 변수 queue<Problem> Q;vector<Problem> Bank;Problem 및에 정의되야 합니다.

    하지만 QBankProblem 정의 아래로 내릴 경우 Problem::Problem()Bank 를 의존하고 있어 문제가 발생할 것입니다.

    따라서 아래와 같이 QBank 의 정의를 아래로 내리고 Problem::Problem() 의 정의 또한 아래로 내려야 합니다.

    #include <iostream>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    struct Problem
    {
        int arr[5] = {3, 3, 0, 0, 0}; //초기 상태;
        int brr[5];
    
        Problem();
    
        void original()
        { //원본 유지
            for (int i = 0; i < 5; i++)
            {
                arr[i] = brr[i];
            }
        }
    
        void clear()
        { //옮기기 전 상태로 이동
            for (int i = 0; i < 5; i++)
            {
                brr[i] = arr[i];
            }
        }
    };
    
    queue<Problem> Q;
    vector<Problem> Bank;
    
    Problem::Problem()
    { //생성자
        for (int i = 0; i < 5; i++)
        {
            brr[i] = arr[i];
        }
        Problem a = *this;
        Bank.push_back(a);
    }
    
    int main()
    {
        Problem mc;
        cout << mc.arr[0] << mc.arr[1] << mc.arr[2] << mc.arr[3] << mc.arr[4] << endl;
        return 0;
    }
    

    만약 두 변수 QBank 를 위에 그대로 두고 싶으시다면, 두 컨테이너 std::vectorstd::queue 의 템플릿 인자를 Problem 이 아닌 Problem* 로 바꿔 하는 방법이 있기는 합니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)