2020. 10. 26. 00:34ㆍ컴퓨터 수업/C++
1. class ItemType을 메소드의 어디까지 붙여야되는걸까?
이건 컴파일이 되지만,
이건 컴파일이 안됀다.
VecType이란 클래스는 없다.
라고 생각해야한다. class를 template class로 선언했기 때문에, 이를 기본 클래스로 구현할 수 없다.
컴파일러 : VecType은 뭐지?, 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 << 연산자 템플릿 클래스에 대해 오버로딩
'컴퓨터 수업 > C++' 카테고리의 다른 글
생성자 오버로딩, 어디까지 ambiguous 한가. (0) | 2020.10.27 |
---|---|
콘솔,파일 출력 연산자 오버로딩 (+=프렌드)(+=템플릿 객체에 대해서)(** 요약필요) (0) | 2020.10.26 |
CLion 인코딩 (0) | 2020.10.24 |
vector클래스 생성자 인수, 생성자의 다른 인수 기입방식 (0) | 2020.10.23 |
대입연산자(=)의 오버로딩 시, referenece를 반환하는 이유 (0) | 2020.10.16 |