Cpp에서 Template 클래스 작성 후기

DonghoShin·2021년 12월 6일
0

삽질후기

목록 보기
1/4

우선 나는 C#에 굉장히 익숙한 사람이다... 과 특성상 C#과 Unity 쓸 일도 많았고 인턴이나 회사에서도 계속 사용해봤다
그러다보니 Cpp작성할 일이라곤 코딩테스트 준비할 때나 인프런 강의 들을 때 말고는 없었는데 호기심에 템플릿 클래스로 Vector나 한번 간단하게 짜볼까 싶어서 짜게 되었다.

자연스럽게 Vetor.h와 Vector.cpp를 만들고 작성한 뒤에 Main함수에서 호출하게 짰더니만 링크가 안된다는 이상한 일이 벌어졌다...

Vector.h파일

#pragma once
#include <iostream>

using namespace std;

template<typename T>
class Vector
{
public:
	int Count;
	int Capacity;
public:
	Vector();
	Vector(T* typePointer, int typeCount);
	~Vector();
	void Add(T t);
	T Front();
	T Last();
	T& operator[](int index);
private:
	T* tArray;
private:
	void ExpandVector();
};

해결방법은 좀 찾아봤더니 다음과 같았다.
1. 헤더파일에 템플릿 클래스 구현을 다 하기
2. 굳이 분리할거면 구현부 파일 확장자를 cpp 대신 hpp를 통해서 해결

나 같은 경우에는 2번 방법으로 해결을 했는데 Vector.hpp를 include 시켜줘야만 한다.

정말 조악하게 작성했지만 나중에 추가로 내용을 작성하거나 더할때를 위한 Github 링크이다.
https://github.com/YeonduBori/UnrealStudy/tree/master/AlgorithmCpp/CppConsole

velog에 글도 한번 써볼겸 해서 겸사겸사 써봤는데 말솜씨나 글솜씨는 아직 영 아닌거 같다. 앞으로 한번씩 작성하면서 언어능력도 기르고 삽질 기록을 남겨둬야 얼만큼 성장했는지 알 수 있을 것 같다.

2021/12/14
헤더파일에 템플릿 클래스 구현을 다 해야한다고 하면 그 이유는 Cpp의 컴파일 과정에 있을 것이란 생각이 닿아 해당 내용 보는 중
참조 : https://inpages.tistory.com/157 (C, C++의 컴파일 과정)
https://hwan-shell.tistory.com/253 (template을 헤더파일에 정리해야하는 이유)
https://docs.microsoft.com/ko-kr/cpp/cpp/templates-cpp?view=msvc-170 (템플릿(C++) 공식문서)

2021/12/15
공식문서에 따르면 컴파일러에서 함수나 클래스가 생성될 때 T가 실제 사용되는 형태의 타입으로 바뀐다.

헤더파일에 template을 선언만 한다면, 컴파일 과정에서 template이 어떤 자료형인지 컴파일러가 알 수 없다.

헤더파일에서 사용도 안했을 뿐더러 정의가 되지 않았기 때문에 자료형을 몰라 컴파일이 안된다.
.cpp에 정의되어 있다곤 하지만 object파일을 만드는 과정에서 컴파일러는 .cpp 안에서 사용되지 않아서 함수를 제외시킨다.

때문에 링크 과정에서 main.cpp가 템플릿 함수를 찾지 못하는 것.

profile
NdotLight 클라이언트 프로그래머

0개의 댓글