Lyn
조회 수 23273 추천 수 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. No Image 29Oct
    by Lyn
    2014/10/29 by Lyn
    Views 23273 

    C++ Template 의 inner class 로 type 선언 하기

  2. 2014.10.14 일 Windows 업데이트 이후 VMWare Not enough physical memory available 오류

  3. VC++ 2013 을 사용 할 경우 실행환경을 정확히 확인해야할 경우가 있습니다.

  4. No Image 02Oct
    by Lyn
    2014/10/02 by Lyn
    Views 7877 

    Windows 10 Technical Preview가 출시되었습니다.

  5. Web 솔루션의 빌드속드와 리로딩속도에 관한 비교

  6. boost::interprocess::managed_shared_memory의 동작에 관하여

  7. No Image 22Aug
    by Lyn
    2014/08/22 by Lyn
    Views 5715 

    Ubuntu 14.04 libssh2-php 설치시 mysql 사라지는 버그

  8. No Image 22Aug
    by Lyn
    2014/08/22 by Lyn
    Views 16743 

    Ubuntu 14.04 php용 ssh 플러그인 패키지명

  9. No Image 22Aug
    by Lyn
    2014/08/22 by Lyn
    Views 30327 

    ubuntu 14.04 에서 apache rotatelogs 설치하기

  10. No Image 19Aug
    by Lyn
    2014/08/19 by Lyn
    Views 28863 

    서버를 이전했습니다.

  11. No Image 30Jul
    by Lyn
    2014/07/30 by Lyn
    Views 25372 

    VC++ 2013 에서 빌드해서 XP에서 돌리기

  12. No Image 30Jul
    by Lyn
    2014/07/30 by Lyn
    Views 18400 

    Unity VS가 무료로 풀렷습니다.

  13. No Image 15Apr
    by Lyn
    2014/04/15 by Lyn
    Views 21828 

    IIS 재시작 콘솔 명령어

  14. No Image 15Apr
    by Lyn
    2014/04/15 by Lyn
    Views 50388 

    IIS 의 Application Pool 실행 계정이 ApplicationPoolIdentity 로 되어있을 경우 폴더 권한 부여 방법

  15. No Image 11Mar
    by Lyn
    2014/03/11 by Lyn
    Views 19295 

    MS 애저 온라인 세미나가 있습니다

  16. No Image 25Jan
    by Lyn
    2014/01/25 by Lyn
    Views 10617 

    Visual Studio 2013 Update 1 릴리즈

  17. No Image 03Dec
    by Lyn
    2013/12/03 by Lyn
    Views 30718 

    Visual C++ 2013 추가기능 2. Variadic Tamplate - 1

  18. No Image 16Nov
    by Lyn
    2013/11/16 by Lyn
    Views 14573 

    MSSQL 에서 Replication 을 삭제할때 오류가 발생 할 경우

  19. No Image 13Nov
    by Lyn
    2013/11/13 by Lyn
    Views 35714 

    MS가 C++AMP 를 clang+llvm 기반으로 포팅했네요.

  20. No Image 02Nov
    by Lyn
    2013/11/02 by Lyn
    Views 24010 

    boostpro 문 닫았네요....

Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8