C++ 템플릿에 관한 얘기

2020. 10. 26. 00:34컴퓨터 수업/C++

1. class ItemType을 메소드의 어디까지 붙여야되는걸까?

 

이건 컴파일이 되지만,

VecType이 식별자 없이 invoke된 경우

이건 컴파일이 안됀다.

VecType이란 클래스는 없다.

라고 생각해야한다. class를 template class로 선언했기 때문에, 이를 기본 클래스로 구현할 수 없다.

컴파일러 : VecType은 뭐지?, VecType은 템플릿 클래스라 식별자가 들어가야되는데...

 

당연하게도 다음 구문도 컴파일되지 않는다.

VecType이 식별자 없이 invoke된 경우

요것도 안됀당

VecType이 식별자를 모르는 경우

 


2. VecType<ItemType> 클래스의 내부에서 클래스를 파라미터로 받는

메소드는<형식>이 지정되어야할까?

그리고 해당 클래스의 인스턴스를 반환할때 <형식>을 지정해줘야 할까?

 

2-1 VecType<ItemType> VecType 아니다 ㅡㅡ

의 메소드가 VecType<ItemType>의 인스턴스를 파라미터로 받을 떄,

<형식>을 지정해줘야되는가?


잠깐 ! CLion의 오류메시지를 알고가요!

1.

Out-of-line declaration of a member must be a definition

class의 밖에서 멤버를 선언하는것은, 반드시 정의를 수반해야한다.

 

2.

C++ requires a type specifier for all declarations

type specifier : 형식 지정자

 

int , void ,double, 등의 dataType을 의미합니다.

 

type specifier = DataType이 어떻게 반환될지를 의미하는 지정자(=specifier)


우선 답은 "아니"다. 

 

위의 코드를 보면 알다시피, 파라미터로 받은 해당 객체는 자연스럽게 알아듣는다 

따라서 class 내부에서 해당 클래스의 인스턴스를 파라미터로 받거나, 지정자로써 메서드의 반환형태로 사용하려면,

ItemType을 붙이지않아도 좋다. 반환에는 붙여줘야한다.

 

즉,

VecType<ItemType>& func(const VecType<ItemType>& _vec) 과

VecType<ItemType>& func(const VecType& _vec) 은 같다. (이건아님)

이같은 맥락에서 템플릿 함수의 내부에서 재귀적으로 함수를 call하려면, template 지정자(ex.ItemType)을 붙이지 않아도 좋다.


Summary

1. 템플릿 클래스 VecType은 <ItemType>이라는 형식 없이는 아예 존재하지 않는다.

 

2. 템플릿 클래스 내부에서 해당 클래스의 인스턴스를 호출하거나 반환할때는 <형식>을 붙이지 않아도 좋다. (템플릿 함수도 마찬가지이다.)


20161026 추가

참고 : blog.plorence.kr/528

 

바운드와 언바운드 프렌드 템플릿 함수 !

 

stackoverflow.com/questions/4660123/overloading-friend-operator-for-template-class

cout << 연산자 템플릿 클래스에 대해 오버로딩