구조체 변수 전방 선언 ,프로토타입 선언 오류
조회수 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
및에 정의되야 합니다.하지만
Q
와Bank
를Problem
정의 아래로 내릴 경우Problem::Problem()
이Bank
를 의존하고 있어 문제가 발생할 것입니다.따라서 아래와 같이
Q
와Bank
의 정의를 아래로 내리고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; }
만약 두 변수
Q
와Bank
를 위에 그대로 두고 싶으시다면, 두 컨테이너 std::vector 와 std::queue 의 템플릿 인자를Problem
이 아닌Problem*
로 바꿔 하는 방법이 있기는 합니다.
댓글 입력