Lyn
조회 수 23314 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

정성태님의 홈페이지를 정독하던중 오랫만에 C++ 관련 글이 하나 올라 왔길래 확인해 보았습니다.
바로 g++에서 inner 클래스를 사용한 템플릿이 제대로 선언 되지 않는다는 문제인데요, 코드는 아래와 같습니다(조금 다릅니다. 원본에 오타가 있어서 좀 고쳣습니다)


원본 : http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=1791


#include <iostream>
#include <vector>
#include <map>

typedef char BYTE;
typedef int _int;
typedef std::vector<BYTE> _byteArrayHolder;
typedef long _long;

template <class T, class V>
class KeepAliveReceiver
{
};

template<class Receiver, class ErrorAction, _int MAX_CONTENT_SIZE = 8192>
class MultiPartByteArrayReceiver : public KeepAliveReceiver< MultiPartByteArrayReceiver<Receiver, ErrorAction>, ErrorAction>
{
	class MultiPartByteArray
	{
	public:
		_int key;
		std::vector<BYTE> byteHolders;
		_long totalSize;

	public:
		MultiPartByteArray(_int _key) : key(_key), byteHolders(), totalSize(0)
		{
		}

		void AddBytes(_byteArrayHolder bytes)
		{
			totalSize += bytes.size();
		}
	};

	typedef KeepAliveReceiver< MultiPartByteArrayReceiver<Receiver, ErrorAction, MAX_CONTENT_SIZE>, ErrorAction> Super;
	typedef MultiPartByteArrayReceiver<Receiver, ErrorAction, MAX_CONTENT_SIZE> This;

public:
	typedef std::map<_int, MultiPartByteArray>  MultiPartBytesMap;
	MultiPartBytesMap receivedMultiPartedBytes;

public:

	MultiPartByteArrayReceiver() : Super(), receivedMultiPartedBytes()
	{}

	void Test()
	{
		MultiPartByteArray a(1);
		std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); //컴파일 오류
	}
};

int main()
{
	std::cout << "Hello World" << std::endl;

	MultiPartByteArrayReceiver<int, int> t;
	t.Test();

	return 0;
}


바로 위와 같은 코드인데, 이는 template 이 완전히 생성 되기 전에, 그 템플릿에 의존하는 type을 인식할 수 없기 때문에 발생합니다
(이런 경우는 템플릿 클래스가 부모 템플릿의 함수를 호출한다거나 할때도 발생합니다)

VC++은 그냥 적당히 알아서 (...) 인식해서 넘어 가는데 이걸 오류로 처리하는 컴파일러도 있습니다. 뭐 만드는사람 취향문제겟지만.


이 문제의 해결법은 바로 type을 인식하지 못하는 것이니 이게 template의 type 명을 나타낸다고 알려주는겁니다.
바로 typename 키워드를 쓰는것인데 그럼 아래와 같게 됩니다



typename std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); //컴파일 오류 


이렇게 하면 뒤의 템플릿 선언문을 타입으로 인식하여 정상적으로 컴파일 됩니다. 물론 VC에서도 마찬가지입니다.
또 템플릿을 선언 할 때 처럼 class 키워드를 써도 OK 입니다. 전 typename 키워드가 헤깔리지 않아 선호하는 편이지만요


PS. 사실 이 모든 문법적 지저분함을 해결하는 마법의 키워드가 C++에 있으니...

그냥 auto 쓰면 됩니다 (...) C++11에서 추가된 auto와 decltype 의 타입추론 시스템은 템플릿을 정말 간단하게 만들어주는 축복이지요

TAG •
?

List of Articles
번호 제목 글쓴이 날짜 조회 수
» C++ Template 의 inner class 로 type 선언 하기 Lyn 2014.10.29 23314
97 boost::icl::interval_map 원하는대로 변경해서 사용해보기 file Lyn 2013.09.23 22405
96 서버를 Windows 2012 R2로 교체 하였습니다. 1 Lyn 2013.09.29 22223
95 IIS 재시작 콘솔 명령어 Lyn 2014.04.15 21858
94 MSDN 에 릴리즈된 MS 제품들입니다. 1 file Lyn 2013.09.10 20680
93 MS SQL Server 2012 언인스톨시 Rsfx Driver 의존성으로 인해 언인스톨이 되지 않는 경우 Lyn 2013.10.09 20042
92 Visual Studio 2013 새로 추가된 기능 둘러보기 file Lyn 2013.10.28 19973
91 2014.10.14 일 Windows 업데이트 이후 VMWare Not enough physical memory available 오류 file Lyn 2014.10.16 19784
90 현재 MSDN Download Page file Lyn 2013.09.23 19680
89 MS 애저 온라인 세미나가 있습니다 file Lyn 2014.03.11 19318
88 VMWare 의 메모리 오류 해결 버전이 나왔습니다 file Lyn 2014.11.06 18719
87 Unity VS가 무료로 풀렷습니다. file Lyn 2014.07.30 18429
86 Ubuntu 14.04 php용 ssh 플러그인 패키지명 Lyn 2014.08.22 16771
85 Visual C++ 2013 RC 추가기능 1. Raw String Literal 3 file Lyn 2013.10.07 15869
84 프로그래밍 대회 알고리즘 파트 문제 2 secret Lyn 2008.11.22 15485
83 Microsoft VC++ MVP를 받았습니다.... file Lyn 2013.10.02 15263
82 MSSQL 에서 Replication 을 삭제할때 오류가 발생 할 경우 Lyn 2013.11.16 14602
81 VS2013 RC 설치해봄 file Lyn 2013.09.28 14139
80 VS 2013 커뮤니티 에디션이 출시되었습니다. Lyn 2014.11.13 13347
79 C++ 에서 Nuget 사용해 보기 file Lyn 2015.03.18 11229
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8