본문 바로가기

카테고리 없음

[C/C++] 일반화된 복사생성자, 중첩템플릿, 멤버 템플릿

https://narss.tistory.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%85%9C%ED%94%8C%EB%A6%BF%EC%9D%98-%EB%A9%A4%EB%B2%84%ED%95%A8%EC%88%98-%EA%B5%AC%ED%98%84

 

2일차 - 멤버함수 템플릿

멤버함수 템플릿 // class template definition template class Stack { public: void Push(T a); template T foo(U a); }; // 1. 클래스 템플릿 멤버함수의 외부구현 template void Stack ::Push(T a) {} // 2...

narss.tistory.com

 

 

https://www.devoops.kr/125?category=691976 

 

C++ 템플릿 일반화된 복사 생성자(Generic copy constructor)

일반화된 복사 생성자 클래스 템플릿의 멤버 함수 템플릿으로 구현하는 복사 생성자. U(int)가 T(double)로 복사(대입) 가능하다면 Complex도 Complex 에 복사(대입) 가능해야 한다. friend class로 선언되

www.devoops.kr

 

----------------------------------------------------------------------------------------------------

 

 

 

 

http://egloos.zum.com/Agbird/v/634809

위의 내용대로 했는데 안되는데??... 일단 이 블로그가 정답임. 

 

클래스 템플릿의 복사 생성자

/// 질문 내용#include using namespace std;class Term{public:    Term() { cout << "Term()" << endl; }    Term(int a) : m(a) { cout << "Term(T a)" << endl; }   &

egloos.zum.com

복사생성자의 경우 클래스의 타입과 정확하게 같아야 한다. 위에서 말한 일반화된 복사생성자의 경우 복사생성자가 아니다. 그냥 다른 생성자일 뿐임. 그리고 함수의 매개변수, return문 등의 임시객체 생성에서는 상황에 맞는 생성자가 실행되는 것이 아니라 무조건 복사생성자자 호출된다. 그래서 일반화된 생성자를 사용하고 싶을경우 복사생성자+새로운 템플릿을 선언한 만능 생성자이렇게 생성자 두 개를 오버로딩해서 만들 수 밖에 없을 둣. 매개변수, return문에는 무조건 복사생성자가 호출되지만 Matrx<int> a=Matrix<float>의 경우 적절한 생성자를 찾아서 호출해주기 때문에 오버로딩함으로써 어느정도 일반화된 복사생성자(복사생성자는 아니지만)의 의미를 구현할 수 있다.