인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

움직이는YM님의 프로필 이미지
움직이는YM

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

템플릿 기초 #1에서 질문

해결된 질문

작성

·

257

0

#include <iostream>

using namespace std;

class Knight

{

public:

// ...

public:

int _hp = 100;

};

// 1) 함수 템플릿

template<typename T>

void Print(T a)

{

cout << a << endl;

}

void Print(int a)

{

cout << a << endl;

}

template<typename T>

T Add(T a, T b)

{

return a + b;

}

template<typename T1, typename T2>

void Print(T1 a, T2 b)

{

cout << a << " " << b << endl;

}

// 연산자 오버로딩 (전역함수 버전)

ostream& operator<< (ostream& os, const Knight& k)

{

os << k._hp;

return os;

}

int main()

{

Print(50);

Print(50.0f);

Print(50.0);

Print("Hello World");

Print("Hello", 100);

Print<int>(50);

Add(50, 30);

Knight k1;

Print(k1);

return 0;

}

1) 위와 같은 코드에서 디버그 해보면(컴파일에서 오류가 납니다)

Run-Time Check Failure #2 - Stack around the variable 'k1' was corrupted. 이런식으로 오류가 납니다

구글링 해본 결과 포인터가 사용시 메모리 침범이 발생하면 알려주는 오류라는데, 위 코드에서 포인터가 없는데도 왜 이런 오류가 나는지 궁금합니다

================================================================

#include <iostream>

using namespace std;

class Knight

{

public:

// ...

public:

int _hp = 100;

};

template<>

void Print(Knight a)

{

cout << "Knight!!!!!!!!!!!" << endl;

cout << a._hp << endl;

}

// 1) 함수 템플릿

template<typename T>

void Print(T a)

{

cout << a << endl;

}

void Print(int a)

{

cout << a << endl;

}

template<typename T>

T Add(T a, T b)

{

return a + b;

}

template<typename T1, typename T2>

void Print(T1 a, T2 b)

{

cout << a << " " << b << endl;

}

// 연산자 오버로딩 (전역함수 버전)

ostream& operator<< (ostream& os, const Knight& k)

{

os << k._hp;

return os;

}

int main()

{

Print(50);

Print(50.0f);

Print(50.0);

Print("Hello World");

Print("Hello", 100);

Print<int>(50);

Add(50, 30);

Knight k1;

Print(k1);

return 0;

}

2) 위 코드의 경우 디버그 해보면

error C2912: 명시적 특수화. 'void Print(Knight)'이(가) 함수 템플릿의 특수화가 아닙니다.
라는 에러가 나옵니다.

구글링 결과 위 에러는 

"이 오류는 Visual Studio .NET 2003에서 수행된 컴파일러 규칙 작업의 결과로 발생합니다. 모든 명시적 특수화의 경우 기본 템플릿의 매개 변수와 일치하도록 명시적 특수화의 매개 변수를 선택해야 합니다."

라고 MS 오류문서에 나와있던데

- 기본 템플릿이란 무엇인가요?

- 위 오류를 제거하려면 어떻게 해야하나요?

위 2가지 문제점이 발생했습니다.

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2) 

위와 같이 특수 버전을 기본 버전 다음에 위치하게 수정을 해주세요.
C++에서 컴파일은 위에서 아래로 일어나기 때문에
특수 버전을 만들기 전에 기본 버전이 만들어져야 합니다.

기본 템플릿이란 무엇이냐면 말 그대로
template<typename T>를 받아주는 가장 기본 형태의 템플릿을 말하는거고
우리가 추가로 특수 케이스에 대해서 만들어준
template<>은 Knight에 대해서만 동작하게 만들어줬으니
(기본 템플릿)이 아닌 (템플릿 특수화)라고 합니다.

1) 
제 환경에선 너무나도 잘 컴파일 되고 실행 되는데요.


Run-Time Check Failure #2 - Stack around the variable 'k1' was corrupted
심지어 위 에러는 컴파일 타임이 아닌 실행 시점에서 발생하는 에러로 추정되는데
프로젝트 [정리] [다시 빌드]로 재빌드 후 실행해도 동일한 문제가 발생하는지 확인 바랍니다.

0

2)번 문제는 말씀하신 대로 해결했습니다

1)번 문제는 정말 정리하고 재부팅하고 하니 해결이 되네요

답변 감사합니다

움직이는YM님의 프로필 이미지
움직이는YM

작성한 질문수

질문하기