성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>G++ - 템플릿 클래스의 iterator 코드 사용에서 발생하는 컴파일 오류</h1> <p> G++ 컴파일러로 다음의 코드를 컴파일 하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #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 MuliPartByteArray { _int key; std::vector<BYTE> byteHolders; _long totalSize; public: MuliPartByteArray(_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, MuliPartByteArray> MultiPartBytesMap; MultiPartBytesMap receivedMultiPartedBytes; public: MultiPartByteArrayReceiver() : Super(), receivedMultiPartedBytes() {} void Test() { <span style='color: blue; font-weight: bold'>std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); // 컴파일 오류</span> } }; using namespace std; int main() { cout << "Hello World" << endl; MultiPartByteArrayReceiver<int, int> t; size_t size = t.receivedMultiPartedBytes.size(); return 0; } </pre> <br /> 이런 컴파일 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > main.cpp: In member function void MultiPartByteArrayReceiver<Receiver, ErrorAction, MAX_CONTENT_SIZE>::Test(): main.cpp:60:28: error: MultiPartByteArray was not declared in this scope std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); ^ main.cpp:60:46: error: template argument 2 is invalid std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); ^ main.cpp:60:46: error: template argument 4 is invalid main.cpp:60:58: error: expected initializer before iter std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); ^ </pre> <br /> 아~~~ 이 현란한 C++ template 사용이여~~~~!<br /> <br /> 위의 컴파일 오류를 보여준 직장 동료의 우회 방법은 MultiPartByteArrayReceiver 클래스 내에 inner 클래스로 정의된 MuliPartByteArray를 바깥으로 빼내는 것이었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #include <iostream> #include <vector> #include <map> // ... [생략]... <span style='color: blue; font-weight: bold'>class MuliPartByteArray { // ... [생략]... }; </span> template<class Receiver, class ErrorAction, _int MAX_CONTENT_SIZE = 8192> class MultiPartByteArrayReceiver : public KeepAliveReceiver< MultiPartByteArrayReceiver<Receiver, ErrorAction>, ErrorAction> { // ... [생략]... }; // ... [생략]... </pre> <br /> 그런데... 사실 inner 클래스는 이유가 있기 때문에 inner 클래스가 된 것인데 그것을 바깥으로 빼내는 것은 그리 바람직해 보이지 않았습니다. 제가 제시한 해결책은 클래스의 전방 선언이었는데, 다음과 같이 처리하는 것이었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #include <iostream> #include <vector> #include <map> // ... [생략]... <span style='color: blue; font-weight: bold'>class MuliPartByteArray;</span> template<class Receiver, class ErrorAction, _int MAX_CONTENT_SIZE = 8192> class MultiPartByteArrayReceiver : public KeepAliveReceiver< MultiPartByteArrayReceiver<Receiver, ErrorAction>, ErrorAction> { class MuliPartByteArray { // ... [생략]... }; // ... [생략]... }; // ... [생략]... </pre> <br /> 이렇게 해주면 컴파일이 잘 됩니다. 직장 동료가 이유를 물었지만... 허허허~~~ 어찌 그것을 제가 알 수 있겠습니까? 단지 과거에 C++ template과 잠시 싸워 온 일종의 감각으로 전방 선언이 효력이 있을 거라는 생각을 했을 뿐입니다. (혹시, 명확한 이유를 알고 계신 분이 있다면 덧글 좀~~~~ ^^)<br /> <br /> 참고로, 이 예제의 코드는 Visual C++ 2013에서는 전방 선언 필요없이도 잘 컴파일됩니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1445
(왼쪽의 숫자를 입력해야 합니다.)