2013-08-02 1 views
0

C++에 삽입 네임 스페이스를 참조 할 수 없습니다왜 내가 하나 개의 프로젝트에서 세 개의 파일을 가지고

하나입니다

namespace sql 
{ 
    namespace detail 
    { 
     void getColumnValue(); 
    } 
} 

다른 하나는

namespace detail{ 
......... 
} 

세번째는

입니다
#include "first_file" 
namespace sql 
{ 
template<typename TheStruct> 
    class RowStruct { 

     public: 
      void shouldCombine() 
      { 
       sql::detail::getColumnValue();   
      } 
} 

세 파일 동일한 프로젝트와 동일한 외부 네임 스페이스에 모두 있어야합니다. 하지만 그 다음에 세 번째 파일에 대해 ": sql :: detail '이 선언되지 않았습니다. "오류가 발생합니다.

"sql"의 "detail"을 참조 할 수없는 이유는 무엇입니까? 세 번째 파일에서 "sql :: detail ::"대신 "detail ::"을 사용하면 두 번째 파일에 선언 된 세부 정보가 표시됩니다. 원하는 내용이 아닙니다.

+1

'detail' 네임 스페이스가 실제로'sql' 안에 선언되어 있습니까? 그건 당신이 보여주는 것이 아닙니다. – Useless

+2

필요한'#include '를 가지고 있습니까? 왜냐하면 그렇지 않다면 (RowStruct' 클래스에 대해)'missing '이외의 다른 것을 보지 못하기 때문입니다. –

+0

헤더 파일 중 첫 번째 파일입니까? 그것을 포함합니까? –

답변

0

세 번째 파일에 첫 번째 파일 (헤더 파일이라고 가정)을 포함해야합니다.

#include "sql_detail.h" 

namespace sql 
{ 
template<typename TheStruct> 
    class RowStruct { 

     public: 
      void shouldCombine() 
      { 
       sql::detail::getColumnValue();   
      } 
    }; 
} 

는과, 두 번째 파일에없는 당신은 아마 "외부 네임 스페이스"당신이 암시가 문제?

namespace sql{ 
namespace detail{ 
//..definitions 
}} 
+0

두 번째 파일은 sql 네임 스페이스 아래에 있지 않으므로 sql :: detail ::을 세 번째 파일 대신 detail :: – user1853170

+0

으로 지정해야하며 세 번째 파일에 이미 "sql_detail.h"가 포함되어 있습니다 , 여전히 작동하지 않는 것 같습니다. – user1853170

+0

@ user1853170 * "그래서 sql :: detail ::"*을 지정해야합니다. 그 이유는 잘못되었습니다. 'sql ::'내부에서'detail ::'은'sql :: detail ::'입니다. 'sql ::'이 필요하다는 사실은 문제의 또 다른 증거입니다. – JoshG79

0

말하고 싶었다 않습니다. 이 외부 네임 스페이스를 정의해야하는 방법은 다음과 같이이다 : 당신이보고있는 것처럼

// file1 
namespace outer { 
    namespace sql { 
    namespace detail { ... } 
    } 
} 

// file3 
#include "file1" 

namespace outer { 
    namespace sql { 
    namespace detail { ... } 
    } 
} 

당신이 파일 3에 namespace outer 내부 #include "file1"을 두는 경우에, 당신은 문제를 얻을 것입니다.

또한 namespace sql (파일 3을 포함한 모든 곳)에있는 경우 명시 적으로 sql::detail::을 말하지 않아도됩니다. 단순히 detail::이면 namespace sql에서 sql::detail::으로 충분합니다. 그리고 그것은 다른 네임 스페이스에있는 namespace detail 정의와 관계가 없습니다 (즉, 파일 2는 변경되지 않습니다).

+0

그래서 "#include file1"을 "namespace outer"외부에 두는 것이 좋습니다. ?? 그것은 내가 한 일이지만 여전히 문제가있는 것 같습니다 : ( – user1853170