수야!╋ 님이 쓰신 글 :
: 안녕하세요. 수야입니다. ( 백만년 만이네요. 꾸벅 )
:
: 오랜시간 사용해오던 라이브러리가 10.3 rio 에서 컴파일 오류가 발생합니다.(최종 작업은 XE5입니다)
:
: 옵션에서 C++ Compilers(WIN32)의 Use 'classic' borland compiler 를 true로 해주면 컴파일이 되긴 하는데...
:
: 다른 라이브러리에서 문제가 발생하여 Use 'classic' borland compiler 를 false 상태로 컴파일이 되게 하고싶습니다.
:
: 발생하는 오류는 첨부파일의 275라인 expected a qualified name after 'typename'
: 등등등 입니다.
:
: 오랫만에 등장해 질문만 불쑥 올려 송구스럽지만.. 잘 부탁드립니다.
답변:
바빠서 요점만 남깁니다.
컴파일러가 template 코드를 파싱할 때...
어떤 요소가 템플릿 인수 T에 dependent 관계를 가질 경우 typename 키워드로 명시해 줘야하고
템플릿 파싱구조 상... two phase name lookup 으로 파서가 구현되어야 합니다.
two phase name lookup으로 컴파일러 파서가 구현되어 있어야
C++ compliant 요구조건을 충족하는 컴파일러가 되는 거고
그렇지 않은 경우 파서를 작위적으로 엉터리로 만들어 놓은 컴파일가 되는 거죠.
gcc, clang, vc++ 와 같은 컴파일러는 two phase name lookup 으로 파서가 구현되어 있는
C++ compliant 요구조건을 만족하는 컴파일러 입니다.
본론으로 돌아와서...
protected:
typename ListObject m_ListObject;
typename ListObject::iterator m_ListPosition;
typename ListObject::reverse_iterator m_ListReveres_Position;
로 되어 있는 부분을...
protected:
typename _T::ListObject m_ListObject;
typename ListObject::iterator m_ListPosition;
typename ListObject::reverse_iterator m_ListReveres_Position;
typedef typename ListObject::iterator IT_I;
typedef typename ListObject::const_iterator IT_CI;
typedef typename ListObject::reverse_iterator IT_RI;
위와 같이 바꾼 후...
public:
inline void RemoveAll()
{
ListObject::const_iterator iter_end( m_ListObject.end() );
위의 코드와 같이... 되어 있는 부분을...
two phase lookup 요구조건을 만족하도록
inline void RemoveAll()
{
IT_CI iter_end( m_ListObject.end() );
위와 같은 식으로 대체해 주면 됨.
using 키워드를 이용하면 코드를 간결하게 작성할 수 있는데, legacy 컴파일러에선 지원되지 않음.
two phase lookup 조건이냐 아니냐에 따라서 기인되는 코드의 실제동작의 차이는
전체코드 없이는 판단할 수 없고, 본인이 알아서 처리하세요.