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 •
?

  1. VMWare 의 메모리 오류 해결 버전이 나왔습니다

    Date2014.11.06 ByLyn Views18719
    Read More
  2. C++ Template 의 inner class 로 type 선언 하기

    Date2014.10.29 ByLyn Views23314
    Read More
  3. 2014.10.14 일 Windows 업데이트 이후 VMWare Not enough physical memory available 오류

    Date2014.10.16 ByLyn Views19784
    Read More
  4. VC++ 2013 을 사용 할 경우 실행환경을 정확히 확인해야할 경우가 있습니다.

    Date2014.10.08 ByLyn Views190578
    Read More
  5. Windows 10 Technical Preview가 출시되었습니다.

    Date2014.10.02 ByLyn Views8021
    Read More
  6. Web 솔루션의 빌드속드와 리로딩속도에 관한 비교

    Date2014.08.29 ByLyn Views175994
    Read More
  7. boost::interprocess::managed_shared_memory의 동작에 관하여

    Date2014.08.22 ByLyn Views208833
    Read More
  8. Ubuntu 14.04 libssh2-php 설치시 mysql 사라지는 버그

    Date2014.08.22 ByLyn Views5790
    Read More
  9. Ubuntu 14.04 php용 ssh 플러그인 패키지명

    Date2014.08.22 ByLyn Views16771
    Read More
  10. ubuntu 14.04 에서 apache rotatelogs 설치하기

    Date2014.08.22 ByLyn Views30388
    Read More
  11. 서버를 이전했습니다.

    Date2014.08.19 ByLyn Views28894
    Read More
  12. VC++ 2013 에서 빌드해서 XP에서 돌리기

    Date2014.07.30 ByLyn Views25400
    Read More
  13. Unity VS가 무료로 풀렷습니다.

    Date2014.07.30 ByLyn Views18429
    Read More
  14. IIS 재시작 콘솔 명령어

    Date2014.04.15 ByLyn Views21858
    Read More
  15. IIS 의 Application Pool 실행 계정이 ApplicationPoolIdentity 로 되어있을 경우 폴더 권한 부여 방법

    Date2014.04.15 ByLyn Views50479
    Read More
  16. MS 애저 온라인 세미나가 있습니다

    Date2014.03.11 ByLyn Views19318
    Read More
  17. Visual Studio 2013 Update 1 릴리즈

    Date2014.01.25 ByLyn Views10638
    Read More
  18. Visual C++ 2013 추가기능 2. Variadic Tamplate - 1

    Date2013.12.03 ByLyn Views30753
    Read More
  19. MSSQL 에서 Replication 을 삭제할때 오류가 발생 할 경우

    Date2013.11.16 ByLyn Views14602
    Read More
  20. MS가 C++AMP 를 clang+llvm 기반으로 포팅했네요.

    Date2013.11.13 ByLyn Views35734
    Read More
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8