0

我在一个项目中有三个文件

一个是

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::,这不是我想要的。

4

2 回答 2

0

您必须将第一个文件(我假设它是一个头文件)包含到第三个文件中。

#include "sql_detail.h"

namespace sql
{
template<typename TheStruct>
    class RowStruct {

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

而且,在第二个文件中,你不想说吗?:

namespace sql{
namespace detail{
//..definitions
}}
于 2013-08-02T16:01:05.260 回答
0

也许您提到的“外部名称空间”是问题所在。你应该定义这个外部命名空间的方式是这样的:

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

// file3
#include "file1"

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

如果你把#include "file1"里面的namespace outer文件3,你会遇到你所看到的问题。

另外,请注意,如果你在里面namespace sql(任何地方,包括 file3),你不需要明确地说sql::detail::. 只需detail::从里面namespace sql给你就足够了sql::detail::。这与其他名称空间中的任何namespace detail定义无关(即您的 file2 不会改变它)。

于 2013-08-02T16:31:07.417 回答