2009년 03월 01일
namespace를 사용 시 전방선언 할 때 error C2872에 대해서

namespace로 쌓여 있는 클래스에서 쌓여있지 않은 클래스를 전방선언해서 사용할 때 error C2872가 발생하였습니다.
아래는 output 창에 나타난 빌드내용입니다.


------ Build started: Project: CompilerErrorC2872, Configuration: Debug Win32 ------

Compiling...
NamespaceOuterClass.cpp
d:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\NamespaceOuterClass.cpp(8) : error C2872: 'CCommonClass' : ambiguous symbol
        could be 'd:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\CommonClass.h(7) : CCommonClass'
        or       'd:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\NamespaceInnerClass.h(15) : Namespace::CCommonClass'
d:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\NamespaceOuterClass.cpp(9) : error C2664: 'Namespace::CNamespaceInnerClass::CNamespaceInnerClass(Namespace::CCommonClass *)' : cannot convert parameter 1 from 'CCommonClass *' to 'Namespace::CCommonClass *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Generating Code...
Compiling...
NamespaceInnerClass.cpp
d:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\NamespaceInnerClass.cpp(8) : error C2872: 'CCommonClass' : ambiguous symbol
        could be 'd:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\CommonClass.h(7) : CCommonClass'
        or       'd:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\NamespaceInnerClass.h(15) : Namespace::CCommonClass'
d:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\NamespaceInnerClass.cpp(9) : error C2511: 'Namespace::CNamespaceInnerClass::CNamespaceInnerClass(CCommonClass *)' : overloaded member function not found in 'Namespace::CNamespaceInnerClass'
        d:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\NamespaceInnerClass.h(18) : see declaration of 'Namespace::CNamespaceInnerClass'
Generating Code...

Build log was saved at "file://d:\Programming\cpp\study\CompilerErrorC2872\CompilerErrorC2872\Debug\BuildLog.htm"
CompilerErrorC2872 - 4 error(s), 0 warning(s)


---------------------- Done ----------------------

    Build: 0 succeeded, 1 failed, 0 skipped



빌드 내용을 살펴 보면 CCommomClass의 선언이 모호해서 compiler가 어떤 CCommonClass를 선택하여 빌드를 해야 할 지 모른다는 내용입니다. NamespaceOuterClass와 NamespaceInnerClass에서 에러 발생하고 있지만 NamespaceOuterClass의 소스 내용을 분석해 보니 이 클래스에는 문제의 소지가 전혀 없어 보입니다. 그래서 CNamespaceInnerClass를 살펴보니 문제의 소지가 다분해 보이는 코드를 발견하였습니다.

그럼, 어디가 문제였을까요? 일단 클래스 다이어그램과 문제의 코드를 보여드릴테니까 한 번 고민해보세요 ~~


// CNamespaceInnerClass.h

namespace Namespace
{

class CCommonClass;

class CNamespaceInnerClass
{
public:
 CNamespaceInnerClass(CCommonClass* arg_pCommonClass);
 ~CNamespaceInnerClass(void);

protected:
 CCommonClass* m_pCommonClass;

};

}


답을 찾으셨나요?? 정답은 class CCommonClass의 선언 위치였습니다. 위 클래스 다이어그램을 살펴보시면 CCommonClass는 Namespace라는 namespace에 속해 있는 클래스가 아닙니다. 그런데 이 클래스를 namesapce Namespace 내부에 선언을 해뒀기 때문에 error C2872가 발생한 것이었습니다.

아래는 이 문제를 해결 한 코드입니다.


// CNamespaceInnerClass.h

class CCommonClass;    // namespace Namespace 밖으로 선언을 옮겼습니다.

namespace Namespace
{

 

class CNamespaceInnerClass
{
public:
 CNamespaceInnerClass(CCommonClass* arg_pCommonClass);
 ~CNamespaceInnerClass(void);

protected:
 CCommonClass* m_pCommonClass;

};

}



* 예제 프로젝트

    CompilerErrorC2872.zip

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by greenfrog | 2009/03/01 15:34 | C++ / WIN32 / MFC | 트랙백 | 덧글(1)
트랙백 주소 : http://greenfrog7.egloos.com/tb/1389586
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by rince at 2009/06/26 22:53
1년뒤....너무 멀군요...
도전 성공하세요 ^^

:         :

:

비공개 덧글



<< 이전 페이지 | 다음 페이지 >>