• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

11:05부근 explicit instantiation이 이해가 잘 가지 않습니다.

22.11.17 06:26 작성 조회수 282

0

char 타입으로 instantiation해야된다는 내용은 main.cpp에 있고 main.cpp는 MyArray. h만 include하고 있으므로 MyArray.cpp파일에 있는 print()의 바디부분을 실행할 때는 templatized된 클래스를 어떤 자료형으로 instantiation해야할 지 모른다는 것까지는 이해했습니다.

그리고 이를 해결하기 위해서 MyArray.cpp에 가서 char 타입으로 컴파일을 해야된다라고 알려주는게 explicit instantiation이다라고 말씀하셨는데 예제를 보면

template class MyArray<char>;
template class MyArray<double>;

이렇게 char 타입도 있고 double 타입도 있으니깐 이건 char 타입으로 컴파일을 해야된다, double 타입으로 컴파일을 해야된다가 될텐데 여기서 다시 char 타입으로 해야하는지 double 타입으로 해야하는지는 결국 main.cpp를 거쳐야 알 수 있는 내용이 아닌가요? 어떤 원리로 char이랑 double의 이지선다가 된 상황에서 char 타입을 선택하게 되는지 궁금합니다.

답변 1

답변을 작성해보세요.

1

강민철님의 프로필

강민철

2022.11.18

원하시는 답이 이 것이 맞는가 싶긴 하지만,

main 함수를 포함한 파일 (강의 코드의 경우 MyArray.h를 include한 파일)을

간과하신 것이 아닐까 싶습니다.

 

13:23 부근을 보시면 MyArray<char>로 선언이 되어 있습니다.

강의에서도 뒤이어 이를 MyArray<double>로 바꾸면 double로 print되구요.

thd2tn님의 프로필

thd2tn

질문자

2022.11.18

그러니깐 main() 에서 MyArray<char>로 선언이 된 거를 MyArray.cpp는 모르니깐 MyArray.cpp에서는 char 타입으로 instantiation이 안되므로 따로 template class MyArray<char>; template class MyArray<double>; 이런 식으로 char로 instantiation 해야된다, double로 instantiation 해야된다라고 명시해놓은게 explicit instantiation이고 이게 지금 2개인데 어째서 <char>로 instantiation이 되냐는 질문이었습니다. 왜 MyArray.cpp는 <char>인 거를 모르는데 <char>과 <double> 두 개로 explicit instantiation 해놓은 상태에서 <char>로 instantiation이 되나요?

강민철님의 프로필

강민철

2022.11.20

음... (질문이 조금 명료하진 않지만) 코드 순서를 혼동하신 것이 아닐까요?

실행은 언제나 main부터입니다.

"링킹 에러가 발생하지 않게 하게끔" instantiation (template class MyArray<char>; template class MyArray<double>;) 을 한 것이구요,

링킹이 되고 나면 main의 MyArray<char> 부터 실행되지요.

그리고 MyArray.cpp에 <char>로 되어 있기 때문에

char 타입으로 실행 되는 것입니다.

강의의 코드의 경우 MyArray.cpp에 꼭

emplate class MyArray<char>;

혹은 template class MyArray<double>;

하나만으로 선언할 필요는 없는 이유이기도 합니다.

thd2tn님의 프로필

thd2tn

질문자

2022.11.20

9:20 부분 강의내용을 보면 "main.cpp에서는 #include "MyArray.h"만 하기 때문에 MyArray.cpp에 있는 내용을 모른다. 그래서 MyArray.cpp에 있는 print()를 instantiation할 때 char 타입으로 해야된다라는 것을 모른다." 라고 하셨는데 이거를 따로 MyArray.cpp에 template class MyArray<char>;로 적어놓으면 MyArray.cpp 파일이 <char>로 instantiation해야된다라는 것을 알게된다라고 이해했는데 double도 적어놓으면 <double>로 instantiation해야된다라는 것도 알게되니깐 이 둘 중에서 어떻게 <char>을 선택하게 되냐는 질문이었습니다.

강민철님의 프로필

강민철

2022.11.20

네 그 질문에 대한 답이었습니다. 디버그 포인트 찍어서 확인해보시면 직접 관찰해볼 수도 있습니다.

thd2tn님의 프로필

thd2tn

질문자

2022.11.21

강민철 교수님 말씀대로라면 애초에 main() 로부터 char이 실행되는 것을 MyArray.cpp가 알게되는 거 같은데 왜 explicit template instantiation을 해주어야하나요?

강민철님의 프로필

강민철

2022.11.21

음.. 의문이 계속 남아 있으신 듯 한데, 혹시 내일 즈음 자세히 답변드려도 될까요?

thd2tn님의 프로필

thd2tn

질문자

2022.11.22

넵 감사합니다

강민철님의 프로필

강민철

2022.11.23

위에서 말씀드렸듯 순서를 생각해보세요.

(사실 이하 설명할 모든 내용들은 디버그 포인트를 찍어보시며 step-in을 하나하나 해보시면 설명을 읽는 것보다 바로 가시적으로 확인이 가능한 부분입니다)

일단 위에서 말씀드린대로

main의 MyArray<char> 부터 실행됩니다.

 

main에는 "MyArray.h"가 있지요.

MyArray.h가 먼저 컴파일 되어야 할텐데,

이 내용만 보면 템플릿으로만 되어 있을 뿐,

쉽게 말해 이것만 보면 어떻게 컴파일되어야 할지에 대한 정보가 빠졌습니다.

다시 말해 이것만 보면 컴파일에 필요한 정보가 빠져 있다는 것이지요.

여기서 어떤 방식으로 컴파일이 가능할 것인지에 대한 내용이 explicit template instantiation입니다.

 

template class MyArray<char>;

template class MyArray<double>;

 

위와 같이 컴파일하라고 알려주는 것입니다.

main에서 컴파일하는 방식을 넘겨주는 방식이 아니라는 뜻이지요.

(아마 이 포인트에서 오해가 생긴 듯합니다)

 

그래서 explicit template instantiation이 필요한 겁니다.

반대로 explicit template instantiation를 하지 않으면 링킹 에러가 생길 수밖에 없는 것이구요.

 

이해가 되셨길 바랍니다.

thd2tn님의 프로필

thd2tn

질문자

2022.11.24

답변해주신 내용을 토대로 생각을 해봤는데 MyArray.cpp에 있는 templatize된 MyArray 클래스의 print()는 어느 타입으로 instantiation이 되어야할 지 모르므로 링킹이 안되는데 explicit template instantiation으로 char과 double에 대해서 마치 함수에 대해서 declaration하는 것처럼 둘 다 instantiation을 하면 char과 double로 intantiation이 된 print()가 존재하므로 컴파일이 되는 것으로 이해했습니다. 제가 instantiation에 대한 이해가 부족했던 거 같습니다. class가 instance를 찍어내는 틀이듯이 template 자체도 instantiation하기 위한 틀로 생각하고 explicit template instantiation이 여러 가지로 나온다고 생각하니깐 이해하기 쉬웠습니다. 감사합니다.

강민철님의 프로필

강민철

2022.11.24

이해가 됐다니 다행입니다 :)